私はセマフォの実装スキームに興味があり、x86 では「ロック プレフィックス」を使用してアトミック操作を実装できることを知り、それを使用してミューテックスを実装したいと考えています。C++ 11 には標準のミューテックスがあることを知っています。 、しかし、私は自分自身を実装したいです。ここに私のコードがあります:
#include <iostream>
#include <thread>
#include <vector>
struct Semaphore
{
private:
int s;
public:
Semaphore( int s ) : s(s){}
void wait()
{
int *p = &s;
_asm
{
mov eax, p
lock dec DWORD PTR [eax]
begin : mov ebx, DWORD PTR [eax]
cmp ebx, 0
jl begin
};
}
void signal()
{
int *p = &s;
_asm
{
mov eax, p
lock inc DWORD PTR [eax]
};
}
} s(1);
void print()
{
s.wait();
std::cout << "Print Thread " << std::this_thread::get_id() << std::endl;
s.signal();
}
int main( int argc, char* argv )
{
std::vector< std::thread > vec;
int n = 3;
for( int i = 0; i < n; ++i ) vec.push_back( std::thread( print ) );
for( int i = 0; i < n; ++i ) vec[i].join();
return 0;
}
問題は、2 つのスレッドがある場合、コードがうまくいくことですが、3 つのスレッドの場合、プログラムはデッドロック状態に陥っているように見えます。x86 マシンでの実装方法について誰かが理由を説明したり、提案をしたりできますか? ?