2012-02-21 9 views
1

私は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"; 
} 

はあなたに感謝します!

ロイ。

+1

ところで、スレッドセーフな方法で整数をインクリメントしたいだけなら、['InterlockIncrement()'](http://msdn.microsoft.com/en-us/library/windows)を使うことができます。 /desktop/ms683614.aspx)。 –

+0

私はあなたがPythonのプログラマを参照してください:) – marcinj

+0

私は知っている、その原則は動作しません。 – roybj

答えて

9

間違いがループforです。次のようになります。

for(int i=0;i<N;++i) 
{ // <--- 
     EnterCriticalSection(&cs); 
     ++(*x); 
     LeaveCriticalSection(&cs); 
} // <--- 

ません括弧forループのみEnterCriticalSection()と他には何を実行するようにします。クリティカルセクションを取得した最初のスレッドは、それをリリースしませんでした:デッドロック

+1

OH MY GOD!私はばかです!私はそれが誰にも起こると思う...ありがとう!これは本当にコピーペーストによる死です。 – roybj

+0

@Roy:または不正なフォーマットによる死...あなたのためにインデントを正規化していないエディタは何ですか? – ildjarn

+0

@ildjarn hehe、実際には、私はプレゼンテーションでそれを書いて、それをコピーしてVSに貼り付けました... – roybj

関連する問題