#include <iostream>
#include <array>
#include <numeric>
#include <thread>
#include <mutex>
#include <stdexcept>
int TotalSum = 0 ;
std:: mutex mtx;
void computeEvenSum( const std:: array < int , 20 > & data) {
int localSum = 0 ;
for ( int num : data) {
if ( num % 2 == 0 ) {
localSum + = num;
}
}
mtx.lock ( ) ;
TotalSum + = localSum;
mtx.unlock ( ) ;
}
void computeOddSum( const std:: array < int , 20 > & data) {
int localSum = 0 ;
for ( int num : data) {
if ( num % 2 ! = 0 ) {
localSum + = num;
}
}
mtx.lock ( ) ;
TotalSum + = localSum;
mtx.unlock ( ) ;
}
int main( ) {
try {
std:: array < int , 20 > numbers;
std:: iota ( numbers.begin ( ) , numbers.end ( ) , 1 ) ;
std:: thread t1( computeEvenSum, std:: ref ( numbers) ) ;
std:: thread t2( computeOddSum, std:: ref ( numbers) ) ;
if ( t1.joinable ( ) ) t1.join ( ) ;
if ( t2.joinable ( ) ) t2.join ( ) ;
std:: cout << "Final value of TotalSum: " << TotalSum << std:: endl ;
}
catch ( const std:: runtime_error & e) {
std:: cerr << "Runtime error: " << e.what ( ) << std:: endl ;
}
catch ( const std:: exception & e) {
std:: cerr << "Exception: " << e.what ( ) << std:: endl ;
}
catch ( ...) {
std:: cerr << "Unknown exception caught." << std:: endl ;
}
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDxudW1lcmljPgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8bXV0ZXg+CiNpbmNsdWRlIDxzdGRleGNlcHQ+CgppbnQgVG90YWxTdW0gPSAwOwpzdGQ6Om11dGV4IG10eDsKCnZvaWQgY29tcHV0ZUV2ZW5TdW0oY29uc3Qgc3RkOjphcnJheTxpbnQsIDIwPiYgZGF0YSkgewogICAgaW50IGxvY2FsU3VtID0gMDsKICAgIGZvciAoaW50IG51bSA6IGRhdGEpIHsKICAgICAgICBpZiAobnVtICUgMiA9PSAwKSB7CiAgICAgICAgICAgIGxvY2FsU3VtICs9IG51bTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIG10eC5sb2NrKCk7CiAgICBUb3RhbFN1bSArPSBsb2NhbFN1bTsKICAgIG10eC51bmxvY2soKTsKfQoKdm9pZCBjb21wdXRlT2RkU3VtKGNvbnN0IHN0ZDo6YXJyYXk8aW50LCAyMD4mIGRhdGEpIHsKICAgIGludCBsb2NhbFN1bSA9IDA7CiAgICBmb3IgKGludCBudW0gOiBkYXRhKSB7CiAgICAgICAgaWYgKG51bSAlIDIgIT0gMCkgewogICAgICAgICAgICBsb2NhbFN1bSArPSBudW07CiAgICAgICAgfQogICAgfQogICAgCiAgICBtdHgubG9jaygpOwogICAgVG90YWxTdW0gKz0gbG9jYWxTdW07CiAgICBtdHgudW5sb2NrKCk7Cn0KCmludCBtYWluKCkgewogICAgdHJ5IHsKICAgICAgICBzdGQ6OmFycmF5PGludCwgMjA+IG51bWJlcnM7CiAgICAgICAgc3RkOjppb3RhKG51bWJlcnMuYmVnaW4oKSwgbnVtYmVycy5lbmQoKSwgMSk7CgogICAgICAgIHN0ZDo6dGhyZWFkIHQxKGNvbXB1dGVFdmVuU3VtLCBzdGQ6OnJlZihudW1iZXJzKSk7CiAgICAgICAgc3RkOjp0aHJlYWQgdDIoY29tcHV0ZU9kZFN1bSwgc3RkOjpyZWYobnVtYmVycykpOwoKICAgICAgICBpZiAodDEuam9pbmFibGUoKSkgdDEuam9pbigpOwogICAgICAgIGlmICh0Mi5qb2luYWJsZSgpKSB0Mi5qb2luKCk7CgogICAgICAgIHN0ZDo6Y291dCA8PCAiRmluYWwgdmFsdWUgb2YgVG90YWxTdW06ICIgPDwgVG90YWxTdW0gPDwgc3RkOjplbmRsOwogICAgfSAKICAgIGNhdGNoIChjb25zdCBzdGQ6OnJ1bnRpbWVfZXJyb3ImIGUpIHsKICAgICAgICBzdGQ6OmNlcnIgPDwgIlJ1bnRpbWUgZXJyb3I6ICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOwogICAgfQogICAgY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CiAgICAgICAgc3RkOjpjZXJyIDw8ICJFeGNlcHRpb246ICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOwogICAgfQogICAgY2F0Y2ggKC4uLikgewogICAgICAgIHN0ZDo6Y2VyciA8PCAiVW5rbm93biBleGNlcHRpb24gY2F1Z2h0LiIgPDwgc3RkOjplbmRsOwogICAgfQoKICAgIHJldHVybiAwOwp9Cg==