私はCRITICAL_SECTIONを使用する単純なCプログラムを持っています。 何らかの理由で何度もCRITICAL_SECTIONに入り、実際にコードを実行せずにスレッドがデッドロックしているようです。 私はこれの理由を見つけることができないようです。ここは単純なCRITICAL_SECTIONを使用してデッドロックされているようです
はコードです:
#include <windows.h>
#include <iostream>
#define N 100000000
CRITICAL_SECTION cs;
static DWORD WINAPI safe_increment(void *param)
{
volatile long* x = (volatile long*)param;
for(int i=0;i<N;++i)
EnterCriticalSection(&cs);
++(*x);
LeaveCriticalSection(&cs);
return 0;
}
void main()
{
InitializeCriticalSection(&cs);
volatile long x = 0;
HANDLE h[2];
DWORD thread_id;
int x = 0;
h[0] = CreateThread(NULL,0,safe_increment,(void*)&x,0,&thread_id);
h[1] = CreateThread(NULL,0,safe_increment,(void*)&x,0,&thread_id);
WaitForMultipleObjects(2,h,TRUE,INFINITE);
CloseHandle(h[0]);
CloseHandle(h[1]);
DeleteCriticalSection(&cs);
std::cout << "Result of safe increment: " << x << "\n";
}
はあなたに感謝します!
ロイ。
ところで、スレッドセーフな方法で整数をインクリメントしたいだけなら、['InterlockIncrement()'](http://msdn.microsoft.com/en-us/library/windows)を使うことができます。 /desktop/ms683614.aspx)。 –
私はあなたがPythonのプログラマを参照してください:) – marcinj
私は知っている、その原則は動作しません。 – roybj