#include <iostream>
#include <vector>
#include <numeric>
#include <thread>
#include <mutex>
#include <stdexcept>
int TotalSum = 0 ;
std:: mutex mtx;
void computeEvenSum( const std:: vector < int > & data) {
int localSum = 0 ;
for ( int num : data) {
if ( num % 2 == 0 ) {
localSum + = num;
}
}
mtx.lock ( ) ;
TotalSum + = localSum;
mtx.unlock ( ) ;
}
void computeOddSum( const std:: vector < int > & data) {
int localSum = 0 ;
for ( int num : data) {
if ( num % 2 ! = 0 ) {
localSum + = num;
}
}
mtx.lock ( ) ;
TotalSum + = localSum;
mtx.unlock ( ) ;
}
int main( ) {
try {
std:: vector < int > numbers( 20 ) ;
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 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bnVtZXJpYz4KI2luY2x1ZGUgPHRocmVhZD4KI2luY2x1ZGUgPG11dGV4PgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKaW50IFRvdGFsU3VtID0gMDsKc3RkOjptdXRleCBtdHg7Cgp2b2lkIGNvbXB1dGVFdmVuU3VtKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGRhdGEpIHsKICAgIGludCBsb2NhbFN1bSA9IDA7CiAgICBmb3IgKGludCBudW0gOiBkYXRhKSB7CiAgICAgICAgaWYgKG51bSAlIDIgPT0gMCkgewogICAgICAgICAgICBsb2NhbFN1bSArPSBudW07CiAgICAgICAgfQogICAgfQogICAgCiAgICBtdHgubG9jaygpOwogICAgVG90YWxTdW0gKz0gbG9jYWxTdW07CiAgICBtdHgudW5sb2NrKCk7Cn0KCnZvaWQgY29tcHV0ZU9kZFN1bShjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBkYXRhKSB7CiAgICBpbnQgbG9jYWxTdW0gPSAwOwogICAgZm9yIChpbnQgbnVtIDogZGF0YSkgewogICAgICAgIGlmIChudW0gJSAyICE9IDApIHsKICAgICAgICAgICAgbG9jYWxTdW0gKz0gbnVtOwogICAgICAgIH0KICAgIH0KICAgIAogICAgbXR4LmxvY2soKTsKICAgIFRvdGFsU3VtICs9IGxvY2FsU3VtOwogICAgbXR4LnVubG9jaygpOwp9CgppbnQgbWFpbigpIHsKICAgIHRyeSB7CiAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiBudW1iZXJzKDIwKTsKICAgICAgICBzdGQ6OmlvdGEobnVtYmVycy5iZWdpbigpLCBudW1iZXJzLmVuZCgpLCAxKTsKCiAgICAgICAgc3RkOjp0aHJlYWQgdDEoY29tcHV0ZUV2ZW5TdW0sIHN0ZDo6cmVmKG51bWJlcnMpKTsKICAgICAgICBzdGQ6OnRocmVhZCB0Mihjb21wdXRlT2RkU3VtLCBzdGQ6OnJlZihudW1iZXJzKSk7CgogICAgICAgIGlmICh0MS5qb2luYWJsZSgpKSB0MS5qb2luKCk7CiAgICAgICAgaWYgKHQyLmpvaW5hYmxlKCkpIHQyLmpvaW4oKTsKCiAgICAgICAgc3RkOjpjb3V0IDw8ICJGaW5hbCB2YWx1ZSBvZiBUb3RhbFN1bTogIiA8PCBUb3RhbFN1bSA8PCBzdGQ6OmVuZGw7CiAgICB9IAogICAgY2F0Y2ggKGNvbnN0IHN0ZDo6cnVudGltZV9lcnJvciYgZSkgewogICAgICAgIHN0ZDo6Y2VyciA8PCAiUnVudGltZSBlcnJvcjogIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsKICAgICAgICBzdGQ6OmNlcnIgPDwgIkV4Y2VwdGlvbjogIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICBjYXRjaCAoLi4uKSB7CiAgICAgICAgc3RkOjpjZXJyIDw8ICJVbmtub3duIGV4Y2VwdGlvbiBjYXVnaHQuIiA8PCBzdGQ6OmVuZGw7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0K