【发布时间】:2013-08-16 15:12:43
【问题描述】:
我对信号量实现方案很感兴趣,我了解到在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 机器?
【问题讨论】:
-
就像 Antti 所说,没有操作系统支持,您无法实现任何类型的健全信号量。
-
正确的互斥量或信号量不能纯粹在用户空间中实现,因为它需要与操作系统的调度程序通信。
标签: c++ assembly concurrency operating-system semaphore