複数のスレッドが配列の値を更新するプログラムがあります。
#include<windows.h>
#include<iostream>
#include<stdio.h>
HANDLE Mutex;
int n = 100;
static DWORD WINAPI ThreadedUpdate(LPVOID param){
DWORD GetMutex;
GetMutex = WaitForSingleObject(Mutex,INFINITE);
if(GetMutex == WAIT_ABANDONED){
std::cout << "Error : Could not get Mutex for working Thread. " << std::endl;
exit(0);
}
else if(GetMutex == WAIT_OBJECT_0){
int* a = (int*) param;
for(int i = 0 ; i < n ; i++)
a[i] += 100;
}
if(!ReleaseMutex(Mutex)){
std::cout << "Error : Could not relese Mutex." << std::endl;
exit(0);
}
return 0;
}
int main(int argc, char** argv){
int numThreads = 50;
int* a = new int[n];
HANDLE* Th = new HANDLE[numThreads];
Mutex = CreateMutex(NULL,FALSE,NULL);
DWORD t;
for(int i = 0 ; i < n ; i++)
a[i] = 0;
for(int i = 0 ; i < numThreads ; i++)
Th[i] = CreateThread(NULL,0,ThreadedUpdate,(void*)a,0,&t);
WaitForMultipleObjects(numThreads, Th, TRUE, INFINITE);
for(int i = 0 ; i < n ; i++)
std::cout << a[i] << std::endl;
std::getchar();
}
さて、上記のプログラムでは、同期のためにミューテックスを使用しています。しかし、私が観察したことは、同期を使用しなくても、得られる答えは正しいということです。この場合、ロックは必要ないということですか。+= 演算子はアトミックですか? これは単なるサンプルプログラムです。複数のスレッドがベクトルを更新する機械学習アルゴリズムで同様のコードを使用しています。その場合でも、ロックを使用せずに期待どおりの出力が得られます。ロックを使用すると、更新が非常に頻繁に行われるため、プログラムが非常に遅くなります。ロックを使用しない場合に問題が発生することを確認したいだけですか?