Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用定时器和信号代替睡眠c/c++;_C++_Multithreading_Timer - Fatal编程技术网

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

C++ 使用定时器和信号代替睡眠c/c++;,c++,multithreading,timer,C++,Multithreading,Timer,我正在编写多线程代码,其中线程必须在特定时间内休眠。我不想浪费CPU周期,我想/不得不使用计时器。这或多或少是我想要实现的 我的单线程代码似乎运行良好 #include <cstdlib> #include <iostream> #include <time.h> #include <sys/siginfo.h> #include <signal.h> #include <unistd.h> volatile sig_at

我正在编写多线程代码,其中线程必须在特定时间内休眠。我不想浪费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;
}
#包括
#包括
#包括
#包括
#包括
#包括
易失性信号原子打印标志=false;
无效句柄_报警(int sig)
{
print_flag=true;
}
int main(int argc,char*argv[])
{
//结构sigevent事件;
信号(信号,处理报警);//首先安装处理程序,
计时器\u t timerid;
结构itimerspec定时器;
计时器\u创建(时钟\u实时、空和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;
我是这样做的

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 );
    }
}

在多线程程序中使用信号时要小心,信号被传递到进程,而您不知道哪个线程将实际捕获信号。若要仅在特定线程中接收信号,所有其他线程都应阻止该信号。请阅读有关该信号的详细信息。因此,在本例中,只有thread2接收到信号(因为它上次安装了处理程序),而另一个永远暂停,依次阻塞主线程。
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 );
    }
}