使用定时器和信号代替睡眠c/c++

using timer and signal instead of sleep c/c++

本文关键字:c++ 定时器 信号      更新时间:2023-10-16

我正在编写多线程代码,其中线程必须在特定时间睡眠。我不想浪费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 << "Hellon" << 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 threadsn" << 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 threadsn" << std::endl;
    pthread_join(thread1,NULL);
    pthread_join(thread2,NULL);
    std::cout << "Donen" << std::endl;
    return EXIT_SUCCESS;
}
编辑:

我用了几种方法,

    通过使用nanosleep,它只是克服了一个问题,繁忙的等待。
  1. 使用clock_nanosleep,它类似于nanosleep,除了它使用相对时钟
  2. 使用timer_settime (pulse),线程等待给定时间的脉冲,最后时钟退出

我是这样做的

struct sigevent         event;
struct itimerspec       itime;
timer_t                 timer_id;
int                     chid, rcvid;
my_message_t            msg;
chid = ChannelCreate(0);
// following code is used to get kick every pulse period time
// which is 20ms
event.sigev_notify = SIGEV_PULSE;
event.sigev_coid = ConnectAttach(ND_LOCAL_NODE, 0,
        chid,
        _NTO_SIDE_CHANNEL, 0);
event.sigev_priority = getprio(0);
event.sigev_code = _PULSE_CODE_MINAVAIL;
timer_create(CLOCK_REALTIME, &event, &timer_id);
// 20 ms to nano seconds
itime.it_value.tv_sec = 0;
itime.it_value.tv_nsec = 20000000;
itime.it_interval.tv_sec = 0;
itime.it_interval.tv_nsec = 20000000;
timer_settime(timer_id, 0, &itime, NULL);
SERVO1DELAY1.tv_sec = 0;
SERVO1DELAY1.tv_nsec = 100000;
while(1)
{
    rcvid = MsgReceive(chid, &msg, sizeof(msg), NULL);
    if (rcvid == 0)
    {
        // make pulse high for appropriate time
        out8( data_handle_A, HIGH );
        InterruptDisable();
        nanospin(&SERVO1DELAY1);
        InterruptEnable();
        out8( data_handle_A, LOW );
    }
}