C++ でのシングルトンおよびマルチスレッド プログラミングに関連する疑問があります。以下に、shared という名前の変数を持つシングルトン クラスのコード例を示します。
シングルトン グローバル インスタンスのその変数を変更 (+1) する 1000 個のスレッドを作成します。shared の最終値は 1000 ですが、この変数を同時実行のために保護していないため、この値は 1000 未満になると予想されます。
クラスがシングルトンであるため、コードは本当にスレッドセーフですか?それともたまたま幸運で値が 1000 であっても、完全に 1000 未満になる可能性がありますか?
#include <iostream>
using namespace std;
class Singleton {
private:
Singleton() {shared = 0;};
static Singleton * _instance;
int shared;
public:
static Singleton* Instance();
void increaseShared () { shared++; };
int getSharedValue () { return shared; };
};
// Global static pointer used to ensure a single instance of the class.
Singleton* Singleton::_instance = NULL;
Singleton * Singleton::Instance() {
if (!_instance) {
_instance = new Singleton;
}
return _instance;
}
void * myThreadCode (void * param) {
Singleton * theInstance;
theInstance = Singleton::Instance();
theInstance->increaseShared();
return NULL;
}
int main(int argc, const char * argv[]) {
pthread_t threads[1000];
Singleton * theInstance = Singleton::Instance();
for (int i=0; i<1000; i++) {
pthread_create(&threads[i], NULL, &myThreadCode, NULL);
}
cout << "The shared value is: " << theInstance->getSharedValue() << endl;
return 0;
}