2016-11-29 5 views
0

だから私はSEND_SLOT構造体を持っている:スレッドAのCriticalSection(s)を入力し、スレッドBのLeaveCriticalSection(s)を入力できますか?

struct SEND_SLOT 
{ 
    SEND_BUFFER buffer; 
    uint16 index; 
    CRITICAL_SECTION slotLock; 
}; 

とコネクション構造体:

struct connexion 
{ 
    ... 
    SEND_SLOT sendSlots[3]; 
    ... 
} 

と私はスレッドAで:

if(TryEnterCriticalSection(&sendSlots[i])) 
{ //Post send request... 
    WSASend(...); 
} 

と私はスレッドBで:

while(...) 
{ 
    ... 
    //request finished, data sent, and i get the index to the SEND_SLOT 
    LeaveCriticalSection(&sendSlots[index]); 
    ... 
} 

私はSEND_SLOTをスレッドAでロックしようとしていますが、後でロックを解除したいのですが、他のスレッドからロックしたいのですが、動作していないときに、既にロックされており、LeaveCriticalSectionは発行されていません。どうして?

+0

その、WindowsのIOCP:プログラマが、それは使用中にシリアルポートへの書き込みから、他のスレッドを防ぐために、条件フラグとして使用していたミューテックスで別のOSで行われ、このようなD –

+0

が見何か。コードが機能しました。他のプログラマーが別のバグを修正するまで、リリースされていないミューテックスのようなものを見つけ、丁寧に修正しました。 Ooops。つまり、プログラマー1は、想定外のミューテックスを使って[Least Le Surpriseの法則](https://en.wikipedia.org/wiki/Principle_of_least_astonishment)に違反しています。あなたがこのようなハックを引くことができたとしても、おそらくそうではありません。 – user4581301

答えて

6

いいえ、これは法的ではありません。

スレッドがクリティカルセクションオブジェクトの所有権を取得するEnterCriticalSectionまたはTryEnterCriticalSection機能を使用しています。documentation for LeaveCriticalSectionEnterCriticalSectionと呼ばれる同じスレッドでもLeaveCriticalSectionを呼び出す必要があると説明します所有権を解放するには、スレッドはクリティカルセクションに入るたびにLeaveCriticalSectionを呼び出す必要があります。

指定されたクリティカルセクションオブジェクトの所有権を持たないスレッドがLeaveCriticalSectionを呼び出すと、エラーが発生し、別のスレッドEnterCriticalSectionを無期限に待機させる可能性があります。

同じ種類の制限がミューテックスに適用されます。あなたのケースでは、セマフォがより適切でしょう。いずれかのスレッドがセマフォオブジェクトの数を増やすためにReleaseSemaphoreを使用することができますがMSDNは、成功しReleaseMutex関数を呼び出すことができますミューテックスを所有するスレッドだけ

を言います。呼ばれる

+0

私は参照してください。ロック - 同じスレッドでロックを解除します。 –

+0

@BalanNarcis:はい。単一のスレッドとのこの関連付けは、OSが放棄されたクリティカルセクションを検出できるようにするものです。 –

+0

リストの特定の要素を「ロック」し、後で他のスレッドをロック解除する場合は、どうすればよいですか? –

関連する問題