A critical section object是最简单的方法。它是一个轻量级的同步对象。
下面是一些代码示例:
#define NUMBER_OF_THREADS 100
// global
CRITICAL_SECTION csMyCriticalSectionObject;
int i = 0;
HANDLE hThread[NUMBER_OF_THREADS];
int main(int argc, char *argv[])
{
// initialize the critical section object
InitializeCriticalSection(&csMyCriticalSectionObject);
// create 100 threads:
for (int n = 0; n < NUMBER_OF_THREADS; n++)
{
if (!CreateThread(NULL,0,func,hThread[n],0,NULL))
{
fprintf(stderr,"Failed to create thread\n");
}
}
// wait for all 100 threads:
WaitForMultipleObjects(NUMBER_OF_THREADS,hThread,TRUE,INFINITE);
// this can be made more detailed/complex to find each thread ending with its
// exit code. See documentation for that
}
链接:CreateThread function和WaitForMultipleObjects function
与螺纹:
// i is global, no need for i to returned by the thread
DWORD WINAPI func(LPVOID lpvParam)
{
EnterCriticalSection(&csMyCriticalSectionObject);
i++;
LeaveCriticalSection(&csMyCriticalSectionObject);
return GetLastError();
}
互斥和/或信号量要远远为此, 。
编辑:信号量基本上是一个可以释放多次的互斥量。它存储了释放操作的数量,因此可以释放相同数量的等待。
你说得对,在这种情况下,互斥是正确的选择。但是,现在这个问题太广泛了。 –
你能解释更多关于不同的线程如何访问'i'吗? – japreiss
假设我通过for循环创建100个线程。个别线程调用这个函数。但是我创建了一个count为5的信号量。那么我仍然需要一个互斥锁来访问共享资源rit? –