使用互斥锁同步线程
Synchronize threads using mutex
我试图理解c++多线程和许多线程之间的同步。因此,我创建了2个线程,第一个增加一个值,第二个减少它。我不明白为什么执行后的结果值与第一个不同,因为我对相同的值进行了加法和减法。
static unsigned int counter = 100;
static bool alive = true;
static Lock lock;
std::mutex mutex;
void add() {
while (alive)
{
mutex.lock();
counter += 10;
std::cout << "Counter Add = " << counter << std::endl;
mutex.unlock();
}
}
void sub() {
while (alive)
{
mutex.lock();
counter -= 10;
std::cout << "Counter Sub = " << counter<< std::endl;
mutex.unlock();
}
}
int main()
{
std::cout << "critical section value at the start " << counter << std::endl;
std::thread tAdd(add);
std::thread tSub(sub);
Sleep(1000);
alive = false;
tAdd.join();
tSub.join();
std::cout << "critical section value at the end " << counter << std::endl;
return 0;
}
<标题> 输出起始临界段值100
尾端临界截面值220
所以我需要的是如何保持我的值,我的意思是计数器等于100使用这两个线程
标题>问题是,两个线程将进入一个"无限"循环1秒,他们会贪婪的互斥锁。在两个函数中执行一次print,看看哪个线程获得锁的次数更多。
互斥锁用于同步对资源的访问,这样线程就不会读写不完整或损坏的数据,也不会创建一个整洁的序列。
如果你想在执行结束时保持该值为100,你需要使用一个信号量,以便对变量的访问有一个有序的序列。
我认为,您想要的是向减法线程发出信号,表明您刚刚成功地添加了添加线程,反之亦然。您必须额外地传达信息,即下一个线程是哪个。一个朴素的解决方案:
bool shouldAdd = true;
add() {
while( alive ) {
if( shouldAdd ) {
// prefer lock guards over lock() and unlock() for exception safety
std::lock_guard<std::mutex> lock{mutex};
counter += 10;
std::cout << "Counter Add = " << counter << std::endl;
shouldAdd = false;
}
}
}
sub() {
while( alive ) {
if( !shouldAdd ) {
std::lock_guard<std::mutex> lock{mutex};
counter -= 10;
std::cout << "Counter Sub = " << counter << std::endl;
shouldAdd = true;
}
}
}
现在add()将忙着等待sub()完成它的工作,然后再尝试获取锁。
为了避免繁忙的等待,您可以选择一个条件变量,而不是尝试只使用单个互斥锁。您可以在添加或减去条件变量之前等待(),然后通知()等待线程。
相关文章:
- 在C++中同步线程
- 将 10 个线程与原子布尔值同步
- 线程过程中的线程同步问题
- 如何定期同步线程?
- 同步线程安全的API,用于暴露缓存数据
- 如何在 pthreads 中正确同步线程
- 通过shared_ptr同步:线程清理器误报
- 如何同步线程以捕获相同数量的帧
- 同步线程和信号
- 使用条件变量(监视器)同步线程
- 同步线程创建和销毁(静态)对象
- NVIDA的CUDA"__syncthreads()"在传统C++中的等价物是什么。如何专业地同步线程?
- 使用事件同步线程
- 如何同步线程(消费者/生产者)
- 以最优雅的方式同步线程
- 使用互斥锁同步线程
- 计算着色器-如何全局同步线程
- GPU for loops:避免扭曲发散和隐式同步线程
- 如果已知访问顺序是安全的,如何在没有互斥锁的情况下同步线程/CPU
- Qt - 同步线程不起作用 - 线程停止但实际上不会停止,有时在不应该停止的时候停止