我有一个程序,其中多个线程更新数组的值。
#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();
}
现在,在上面的程序中,我使用互斥锁进行同步。但我观察到的是,即使我不使用同步,我得到的答案也是正确的。这是否意味着在这种情况下不需要锁。+= 运算符是原子的吗?这只是一个示例程序。我在机器学习算法中使用了类似的代码,其中多个线程正在更新一个向量。即使在那种情况下,我在不使用锁的情况下也能得到预期的输出。由于更新非常频繁,使用锁会使程序变得非常慢。我只是想确保如果我不使用锁会有什么问题吗?