私は小さな問題があり、誰かが助けてくれるのだろうかと思っています。私は可能な限り簡単な方法で問題を実証しようとしました。私は複数のスレッドへの参照によってオブジェクトを渡そうとしています。すべてのスレッドは、オブジェクト "Example"に属するメンバ関数である "doSomething"を呼び出します。 "doSomething"関数は、カウンタをインクリメントする必要があります。私のgccのバージョンは4.4.7参照とマルチスレッドによるオブジェクトの受け渡し
質問です:私はスレッド関数への参照によって、オブジェクトを通過したものの、変数「カウンタ」の値がインクリメントされないされている理由
。
コード:
#include <iostream>
#include <thread>
class Exmaple {
private:
int counter;
public:
Exmaple() {
counter = 0;
}
void doSomthing(){
counter++;
}
void print() {
std::cout << "value from A: " << counter << std::endl;
}
};
// notice that the object is passed by reference
void thread_task(Exmaple& o) {
o.doSomthing();
o.print();
}
int main()
{
Exmaple b;
while (true) {
std::thread t1(thread_task, b);
t1.join();
}
return 0;
}
出力:あなたがここに知っておく必要があり
value from A: 1
value from A: 1
value from A: 1
value from A: 1
value from A: 1
value from A: 1
value from A: 1
value from A: 1
value from A: 1
あなたはあなたが 'atomic_int'または同期させるためのいくつかの他の手段を必要とする – RbMm