だから私は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は発行されていません。どうして?
その、WindowsのIOCP:プログラマが、それは使用中にシリアルポートへの書き込みから、他のスレッドを防ぐために、条件フラグとして使用していたミューテックスで別のOSで行われ、このようなD –
が見何か。コードが機能しました。他のプログラマーが別のバグを修正するまで、リリースされていないミューテックスのようなものを見つけ、丁寧に修正しました。 Ooops。つまり、プログラマー1は、想定外のミューテックスを使って[Least Le Surpriseの法則](https://en.wikipedia.org/wiki/Principle_of_least_astonishment)に違反しています。あなたがこのようなハックを引くことができたとしても、おそらくそうではありません。 – user4581301