我遇到以下代码的问题:
#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;
}
[LATER EDIT] 好吧,所以看起来像boost :: this_thread :: sleep在后台获取了一个互斥锁,所以我想我会坚持使用普通的老式睡眠(),这对我来说很有用。 [/ LATER EDIT]
从main()我发出一个计算2秒的t1线程和另一个执行以下操作的线程:fork()在其中,父级等待子级,子级创建另一个也计数2秒的线程。
问题是,如果我使用boost :: this_thread:sleep程序会以某种方式挂起或死锁。如果我使用sleep(),那么它可以正常工作。我在这里做错了吗?这两者有什么区别?
从睡眠的手册中我得到了:
“sleep()使调用线程休眠直到秒秒或信号到达而不被忽略。 “
同样来自boost docs,boost :: this_thread :: sleep似乎做同样的事情。
答案 0 :(得分:4)
你在这里做危险的事情: fork调用复制整个程序,但只运行一个线程(当前一个) 在新的过程中。所以所有的互斥锁在这里,但只有一个线程。 如果某些线程锁定互斥锁并且您的线程尝试将其锁定在新进程中, 它将永远等待。
下面
boost::this_thread::sleep(boost::posix_time::millisec(1000));
如果看看boost的包含文件,睡眠看起来像:
this_thread::sleep(get_system_time()+rel_time);
get_system_time从libc调用tz_convert,它接受mutex。并且看起来像在fork之前另一个线程锁定它,并且......