我有一个Linux程序,它产生多个进程(fork),并通过POSIX共享内存进行通信。我想让每个进程分配一个id (0-255)。我的意图是在共享内存区域中放置一个位向量(初始化为0),并自动比较和交换一个位以分配一个id。
有没有一种对c++11友好的方式来做到这一点?我能创建一个原子位集吗?我可以跨进程使用互斥吗?如何确保构造函数在所有进程中只被调用一次?
发布于 2012-11-01 01:19:46
C++11线程原语(互斥、原子等)是线程原语。C++标准没有引用进程,并且这些工具中的大多数都不能跨进程互操作。
该标准中唯一提到的过程是在一个非标准化符号中,该符号指出lock-free atomics are intended to be OK for IPC
无锁的
操作也应该是无地址的。也就是说,通过两个不同的地址在同一内存位置上的原子操作将以原子方式通信。实现不应该依赖于任何每个进程的状态。此限制允许多次映射到进程的内存和两个进程之间共享的内存进行通信。
除了这种非标准化的表示法之外,线程原语并不是实现进程间通信的一种手段。这些对象放在共享内存中时的行为(除了上面提到的无锁原子)是未定义的。
发布于 2013-11-11 22:35:54
你可以在共享内存块内部使用互斥锁,但互斥锁必须声明为共享,因此在共享内存内使用互斥锁并不罕见,你可以创建自己的类,非常简单:
class Mutex {
private:
void *_handle;
public:
Mutex(void *shmMemMutex, bool recursive =false, );
virtual ~Mutex();
void lock();
void unlock();
bool tryLock();
};
Mutex::Mutex(void *shmMemMutex, bool recursive)
{
_handle = shmMemMutex;
pthread_mutexattr_t attr;
::pthread_mutexattr_init(&attr);
::pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
::pthread_mutexattr_settype(&attr, recursive ? PTHREAD_MUTEX_RECURSIVE_NP : PTHREAD_MUTEX_FAST_NP);
if (::pthread_mutex_init((pthread_mutex_t*)_handle, &attr) == -1) {
::free(_handle);
throw ThreadException("Unable to create mutex");
}
}
Mutex::~Mutex()
{
::pthread_mutex_destroy((pthread_mutex_t*)_handle);
}
void Mutex::lock()
{
if (::pthread_mutex_lock((pthread_mutex_t*)_handle) != 0) {
throw ThreadException("Unable to lock mutex");
}
}
void Mutex::unlock()
{
if (::pthread_mutex_unlock((pthread_mutex_t*)_handle) != 0) {
throw ThreadException("Unable to unlock mutex");
}
}
bool Mutex::tryLock()
{
int tryResult = ::pthread_mutex_trylock((pthread_mutex_t*)_handle);
if (tryResult != 0) {
if (EBUSY == tryResult) return false;
throw ThreadException("Unable to lock mutex");
}
return true;
}https://stackoverflow.com/questions/13161153
复制相似问题