我所要做的就是启动一个帖子,看看它是否在一段时间内完成。
OS:linux;语言:C ++。
我不想使用非便携式功能(如this answer中建议的那样)。
有没有办法做到这一点,除了使用互斥锁和 条件变量(如建议here)?两个线程之间没有共享数据,所以从技术上讲我不需要互斥锁。 对于启动线程的函数,我想要的只是
主题已完成或
过了一段时间。
...并尽可能简化代码。
答案 0 :(得分:2)
如果你想使用boost :: thread,那么“通常的”bool标志,条件变量,互斥方法就像这样简单:
bool ready = false;
boost::mutex mutex;
boost::condition_variable cv;
// function to be executed by your thread
void foo()
{
// lengthy calculation
boost::mutex::scoped_lock lock( mutex );
ready = true;
cv.notify_one();
}
// will return, if the thread stopped
bool wait_for_foo( time_point abs_time )
{
boost::mutex::scoped_lock lock( mutex );
while ( !ready && cv.wait_until( lock, abs_time ) != cv_status::no_timeout )
;
return ready;
}
好吧,使用posix并不简单; - )
答案 1 :(得分:1)
你可以创建计时器线程,一旦达到计时器,就会发现timeout
取消。没有必要让mutex.code像:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define TIMEOUT 1*60 //in secend
int count = 0;
pthread_t t_main; //Thread id for main thread
void * timer_thread()
{
while (TIMEOUT > count)
{
sleep(1); //sleep for a secand
count++;
}
printf("killinn main thread\n");
pthread_cancel(t_main); // cancel main thread
}
void * m_thread()
{
pthread_t t_timer; //Thread id for timer thread
if (-1 == pthread_create(&t_timer, NULL, timer_thread, NULL))
{
perror("pthread_create");
return NULL;
}
//DO your work...
while(1)
{
sleep(2);
}
}
int main()
{
if ( -1 == pthread_create(&t_main, NULL, m_thread, NULL))
{
perror("pthread_create");
return -1;
}
if (-1 == pthread_join(t_main, NULL))
{
perror("pthread_join");
return -1;
}
return 0;
}
答案 2 :(得分:0)
你甚至不需要一个条件变量,你可以让另一个线程在进入时锁定一个互斥锁并在它完成时解锁它,并让启动线程使用pthread_mutex_timedlock
(在旧版本的POSIX中可选) ,POSIX 2008中要求尝试获取互斥锁,如果另一个线程尚未完成则超时。