【发布时间】:2018-03-04 06:13:12
【问题描述】:
我在 linux Debian 系统上使用下面的 foo.cpp 代码:
#include <iostream>
#include <mutex>
#include <condition_variable>
#include <chrono>
#include <thread>
std::mutex mtx;
std::condition_variable cvar;
long next = 0;
void doit(long index){
std::unique_lock<std::mutex> lock(mtx);
cvar.wait(lock, [=]{return index == next;});
std::cout<< index << std::endl;
++next;
mtx.unlock();
cvar.notify_all();
return;
}
int main()
{
long n=50;
for (long i=0; i < n; ++i)
std::thread (doit,i).detach();
while(next != n)
std::this_thread::sleep_for(std::chrono::milliseconds(100));
return(0);
}
我编译它:
g++ -std=c++14 -pthread -o foo foo.cpp
它旨在触发 50 个分离的线程,这些线程由函数 doit 中的互斥锁和条件变量控制,因此它们按顺序执行互斥锁块。
它大部分时间都在工作,将数字 00 到 49 写入屏幕,然后终止。
但是,它有两种偶尔的故障模式:
失败模式1:在上升到某个任意数字
foo: ../nptl/pthread_mutex_lock.c:80: __pthread_mutex_lock: 断言 `mutex->__data.__owner == 0' 失败。
失败模式 2:在达到任意数字
我会很感激有关此行为的原因以及如何解决它的任何建议。
================================================ ============================
编辑:好的,这是一个有效的修订版本。我修复了这两个错误,并将锁名称从“lock”更改为“lk”以减少混淆。感谢您的帮助。
#include <iostream>
#include <mutex>
#include <condition_variable>
#include <thread>
std::mutex mtx;
std::condition_variable cvar;
long next = 0;
void doit(long index){
std::unique_lock<std::mutex> lk(mtx);
cvar.wait(lk, [=]{return index == next;});
std::cout<< index << std::endl;
++next;
lk.unlock();
cvar.notify_all();
return;
}
int main()
{
long n=50;
for (long i=0; i < n; ++i)
std::thread (doit,i).detach();
{
std::unique_lock<std::mutex> lk(mtx);
cvar.wait(lk, [=]{return n == next;});
}
return(0);
}
【问题讨论】:
标签: c++ multithreading pthreads mutex condition-variable