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