【发布时间】:2015-10-19 07:36:32
【问题描述】:
我正在处理多线程代码,其中线程必须休眠特定时间。我不想浪费 CPU 周期并且想要/必须使用计时器。这或多或少是我想要实现的。
我的单线程代码似乎运行良好。
#include <cstdlib>
#include <iostream>
#include <time.h>
#include <sys/siginfo.h>
#include <signal.h>
#include <unistd.h>
volatile sig_atomic_t print_flag = false;
void handle_alarm(int sig)
{
print_flag = true;
}
int main(int argc, char *argv[])
{
//struct sigevent event;
signal( SIGALRM, handle_alarm ); // Install handler first,
timer_t timerid;
struct itimerspec timer;
timer_create(CLOCK_REALTIME,NULL,&timerid);
timer.it_value.tv_sec = 1;
timer.it_value.tv_nsec = 0;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_sec = 0;
std::cout << "Setting timer" << std::endl;
timer_settime(timerid,0,&timer,NULL);
pause();
std::cout << "Hello\n" << std::endl;
return EXIT_SUCCESS;
}
但我的多线程卡在执行中。我的主线程卡在等待线程,而 thread1 卡在设置计时器上。知道为什么 thread1 没有完成执行吗?
#include <cstdlib>
#include <iostream>
#include <time.h>
#include <sys/siginfo.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>
volatile sig_atomic_t print_flag = false;
void handle_alarm(int sig)
{
print_flag = true;
}
void *mythread(void* time)
{
signal( SIGALRM, handle_alarm ); // Install handler first,
timer_t timerid;
struct itimerspec timer;
timer_create(CLOCK_REALTIME,NULL,&timerid);
timer.it_value.tv_sec = *(int*)time;
timer.it_value.tv_nsec = 0;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_sec = 0;
std::cout << "Setting timer" << std::endl;
timer_settime(timerid,0,&timer,NULL);
pause();
std::cout << "Hello" << *(int*)time << std::endl;
}
int main(int argc, char *argv[])
{
pthread_t thread1, thread2;
std::cout << "Started threads\n" << std::endl;
int temp1 = 10,temp2 = 5;
pthread_create(&thread1, NULL, &mythread,(void*) &temp1);
pthread_create(&thread2, NULL, &mythread,(void*) &temp2);
std::cout << "Waiting for threads\n" << std::endl;
pthread_join(thread1,NULL);
pthread_join(thread2,NULL);
std::cout << "Done\n" << std::endl;
return EXIT_SUCCESS;
}
编辑:
我通过几种方法做到了,
- 通过使用 nanosleep,它只解决了一个问题,忙等待。
- 使用clock_nanosleep,它类似于nanosleep,只是它使用相对时钟
- 使用 timer_settime (pulse),线程等待给定时间的脉冲,最后打卡
【问题讨论】:
-
在多线程程序中使用信号时要小心,信号被传递到进程,而你不知道哪个线程会实际捕获它。要仅在特定线程中接收信号,所有其他线程都应阻塞该信号。阅读更多关于它的信息in the
signal(7)manual page。 -
所以在这种情况下,只有线程 2 收到了信号(因为它最后安装了处理程序),而另一个则永远暂停,依次阻塞你的主线程。
标签: c++ multithreading timer