Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I keep separate variable copy for same class object's member function?

  • I have a class object obj1 and I am trying to call a member function sdf_write from 2-separate-threads.
  • There is a static variable wr_count inside the member-function.

The issue is: when I run both threads, the wr_count value is being shared between both threads.

For e.g. thread_1 runs 8-times and makes the wr_count=8 but when thread_2 starts it makes the wr_count=9. I want thread_2 to start counting from "1" not from the last value of thread_1.

Here is my code:

#include <iostream>
#include <stdio.h>
#include <thread>
#include "sdf_func.hpp"
#include <vector>
using namespace std;
int main() {
    sdf obj1;
    std::thread t1([&obj1](){
        for (int i=0; i<30; i++) {
        while (!obj1.sdf_write(10));
        };
    });
    t1.detach();
    std::thread t2([&obj1](){
        for (int i=0; i<30; i++) {
        while (!obj1.sdf_write(10));
        };
    });
    t2.join();

    cout << "done: " << obj1.done << endl;

    // cout << "done: " << obj2.done << endl;

    // cout << "wr_count: " << obj1.wr_count << endl;
    return 0;   
}

// This is sdf_func/////////////////
#include <iostream>
#include <stdio.h>
#include <thread>
#include <mutex>
using namespace std;
class sdf {
    public:
    int done;
    std::mutex mutex;
    sdf() : done(0){};
    void increment() {
        std::lock_guard<std::mutex> guard(mutex);
        ++done;
    }
    bool sdf_write (auto size) {
        static int wr_count = 0;
        if (wr_count == size) {
            wr_count = 0;
            increment();
            //cout << "done : " << done;
            return false;
        }
        wr_count++;
        cout << wr_count << "--" << std::this_thread::get_id() << endl;
        return true;
    }
};
like image 600
Tushar Avatar asked Apr 19 '26 03:04

Tushar


1 Answers

This is a perfect job for the thread_local storage duration, which is a keyword introduced from C++11.

thread_local int wr_count;

Essentially, you get a separate static instance of wr_count per thread; each one is initialised to 0.

Reference: http://en.cppreference.com/w/cpp/keyword/thread_local

like image 52
Bathsheba Avatar answered Apr 20 '26 16:04

Bathsheba



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!