c++ Boost线程睡眠死锁
C++ Boost thread sleep deadlock
我有一个问题与以下代码:
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <iostream>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;
void f1(uint count)
{
while(count-- > 0)
{
// boost::this_thread::sleep(boost::posix_time::millisec(1000));
sleep(1);
}
}
void folkflore()
{
int res = fork();
//parent
if ( res )
{
wait(NULL);
}
else
{
unsigned int x = 2;
boost::thread tx(boost::bind(f1, 2));
tx.join();
_exit(-5);
}
}
int main()
{
std::cout << "Main program " << getpid() << std::endl;
unsigned int x = 2;
boost::thread t1(boost::bind(f1, 2));
boost::thread m(folkflore);
m.join();
t1.join();
return 0;
}
(后来编辑)好吧,看起来boost::this_thread::sleep在后台获得了一个互斥锁,所以我想我会坚持使用普通的sleep(),这对我来说是很好的。[/后编辑]
从main()我发出一个t1线程,计数2秒,另一个线程做以下事情:fork()在它里面,父线程等待子线程,子线程创建另一个线程,也计数2秒。
问题是如果我使用boost::this_thread:sleep,程序会挂起或死锁。如果我使用sleep(),那么它工作正常。我做错什么了吗?这两者的区别是什么?
从sleep的man-page中我得到:
"sleep()使调用线程休眠,直到秒秒过去或信号到达,该信号不会被忽略。"
同样来自boost文档,boost::this_thread::sleep似乎做同样的事情。
你在这里做危险的事情:Fork调用复制整个程序,但只运行一个线程(当前线程)在新的过程中。这里都是互斥,但只有一个线程。如果某个线程锁定了互斥锁,而你的线程试图在新进程中锁定它,它将永远等待。
这里boost::this_thread::sleep(boost::posix_time::millisec(1000));
如果看看boost的include文件,sleep看起来像:
this_thread::sleep(get_system_time()+rel_time);
get_system_time从libc调用tz_convert,它接受互斥锁。在fork之前,另一个线程锁定了它,然后…
相关文章:
- 用C++中的std::condition_variable将线程置于死锁中会有风险吗
- localtime() 函数正在调用 ___lll_lock_wait_private(),这会使线程陷入死锁
- Qt:向死/停止线程发送信号
- 多线程Windows GUI应用程序中的死锁
- 死锁使用 std::mutex 来保护多个线程中的 cout
- 一个线程提升的死锁
- 是否访问指针元组和互斥锁线程安全
- C++互斥锁线程优先级
- 解决死锁问题,在主线程中等待多个工作线程完成 (C++11)
- 为什么我的程序在拥有线程的情况下生成LdrpLoaderLock死锁
- 避免单个线程中的死锁
- 这个简单的(原子)锁线程安全吗
- 线程tcp服务器死锁
- 线程安全std::cout的死锁
- 提升线程死锁,任何人都可以检查原因
- 如何在 QT 中使用互斥锁线程开始轮询
- 无锁线程池
- FFMPEG:多线程解码死锁
- 如何在C++Qt程序中调试多线程死锁
- 这种类型的编码是线程安全的还是死锁安全的