我对信号量实现方案很感兴趣,我了解到在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;
}
问题是当有两个线程时,代码运行良好,而在 3 个线程的情况下,程序似乎陷入死锁状态,谁能解释原因或给我一些关于如何在 x86 机器上实现的建议?