std::shared_mutex
#include <thread>
#include <shared_mutex>
#include <mutex>
#include <iostream>
#include <cstring>
#include <cstdio>
using std::thread,
std::shared_mutex,
std::unique_lock,
std::shared_lock,
std::FILE,
std::fopen,
std::fwrite,
std::fclose,
std::cerr;
//comment out this line to see what happens without shared_mutex
#define WITH_SHARED_MUTEX
int main(){
char buffer[100000]{"\0"};
int value = 0;
shared_mutex mu;
auto adder = [&mu](char* b, int* v){
char temp[50]{"\0"};
char format[21]{"Thread Id %i v: %i\n\0"};
#ifdef WITH_SHARED_MUTEX
unique_lock<shared_mutex> lock(mu);
#endif
for(int i = 0; i < 1000; ++i){
*v += 5;
sprintf(temp, format, std::this_thread::get_id(), *v);
strcat(b, temp);
temp[0] = '\0';
}
mu.unlock_shared();
};
auto subtracter = [&mu](char* b, int* v){
char temp[50]{"\0"};
char format[30]{"Thread Id %i v: %i !!!!!!\n\0"};
#ifdef WITH_SHARED_MUTEX
unique_lock<shared_mutex> lock(mu);
#endif
for(int i = 0; i < 1000; ++i){
*v -= 5;
sprintf(temp, format, std::this_thread::get_id(), *v);
strcat(b, temp);
temp[0] = '\0';
}
mu.unlock_shared();
};
thread t(adder, buffer, &value);
thread u(subtracter, buffer, &value);
t.join();
u.join();
cerr << "complete\n";
cerr << "strlen: " << strlen(buffer) << "\n";
FILE* f = fopen("zzzzzz.txt", "w+");;
fwrite(buffer, sizeof(char), strlen(buffer), f);
fclose(f);
return 0;
}
C++ Examples© 2024 TBD