C 11解释原子和静音
c++11 interprocess atomics and mutexes
本文关键字:解释 更新时间:2023-10-16
我有一个Linux程序,该程序催生了几个过程(fork),并通过POSIX共享内存进行通信。我想让每个进程分配一个ID(0-255)。我的目的是将BitVector放置在共享内存区域(初始化为零),并在原子上比较并交换一些分配ID。
是否有C 11对此友好的方法?我可以创建一个原子块吗?我可以在过程中使用互斥X吗?我如何确保在所有过程中仅一次又一次地调用构造函数?
c 11螺纹原始词(静音,原子等)是螺纹 iminives。C 标准不参考过程,并且大多数这些工具不会跨进程进行互操作。
标准中唯一的流程是在非规范性符号中,该符号说,无锁原子的目的是适合IPC:
无锁的操作也应无锁定。也就是说,通过两个不同地址在同一内存位置上的原子操作将在原子上进行交流。实施不应取决于任何人为状态。该限制可以通过内存进行通信,该内存将不止一次地映射到一个过程中,并通过两个过程之间共享的内存。
之间。
在此非规范符号之外,螺纹原始词并非打算是实现过程间通信的一种手段。将这些对象的行为放在共享内存中(如上所述,除了无锁的原子)是未定义的。
您可以在共享内存块内使用互斥X,但是必须将静音符号声明为共享,因此使用共享内存内的默特克斯在共享中并不异常简单:
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;
}
相关文章:
- 请解释"函数1(p1,p2,p3);"的输出
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 被解释为低级别const的const对象的地址
- 计算每个节点的树高,帮助我解释这个代码解决方案
- MSVC将仅移动结构参数解释为指针
- 内联程序集printf将整数解释为地址
- 有人能解释一下为什么下界是这样工作的吗C++的
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 有人能为我解释一下C++代码吗
- 你能解释一下什么运行时错误是如何解决它的吗?
- 请解释字谜的代码,我看不懂计数器数组,每个值已经是0
- 有人可以向我解释为什么控制台输出 0 吗?
- 有人可以解释一下这段代码如何能够反转字符串
- 在 C++ 中解释多维向量的语句时感到困惑
- 解释一下 for (char c : str) 的作用?
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- 隐式重新解释引用时强制转换,没有警告/错误
- 有人可以在 c++ 中解释数组的这种输入
- 有人可以解释一下这个矩阵幂函数是如何工作的吗?