C++ 无锁同步
我正在考虑使用下面的机制来同步两个或更多线程。我认为唯一的缺点是CPU的使用。请分享您对该机制的评论。这个实现有什么问题吗?(假设gcc的_sync*功能是可移植的)C++ 无锁同步,c++,c,multithreading,gcc,C++,C,Multithreading,Gcc,我正在考虑使用下面的机制来同步两个或更多线程。我认为唯一的缺点是CPU的使用。请分享您对该机制的评论。这个实现有什么问题吗?(假设gcc的_sync*功能是可移植的) 因此,任何想要访问共享或全局数据的线程都会首先调用acquireLock,访问全局数据,然后释放锁。您正在实现一种自旋锁。您可以使用CAS循环代替递增和递减: void acquireLock () { while (!_sync_bool_compare_and_swap(&lock, 0, 1)) {} }
因此,任何想要访问共享或全局数据的线程都会首先调用acquireLock,访问全局数据,然后释放锁。您正在实现一种自旋锁。您可以使用CAS循环代替递增和递减:
void acquireLock () {
while (!_sync_bool_compare_and_swap(&lock, 0, 1)) {}
}
void releaseLock () {
int unlock_success = _sync_bool_compare_and_swap(&lock, 1, 0);
assert(unlock_success);
}
比较和交换将检查变量内容是否与预期值(第二个参数)匹配。如果是,它将把变量设置为新值(第三个参数)。如果预期值不匹配,则调用失败。这是一个原子操作。什么是好的解决方案。但是,既然您也问了您的解决方案可能有什么问题,我的看法是:
您将“锁获取失败”分为两个步骤:
void acquireLock () {
while (!_sync_bool_compare_and_swap(&lock, 0, 1)) {}
}
void releaseLock () {
int unlock_success = _sync_bool_compare_and_swap(&lock, 1, 0);
assert(unlock_success);
}