如何制作timer_create和timer_delete多线程证明

问题描述 投票:0回答:1

我陷入了一种特殊的情况,我从一个线程调用timer_create并从另一个线程调用timer_delete。但我似乎无法让它工作,因为它最终陷入僵局:

我不知道如何使其线程安全,我应该使用互斥体吗?或者我应该使用其他方法来避免死锁?

我的代码如下:

#include <iostream>
#include <stdlib.h>

#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include "pthread.h"



typedef struct 
{
    struct sigevent     tmrSigEvt;
    timer_t             tmr;
}TMR_DATA_T;

int a = 10;
int b = 20;
int c = 0;


TMR_DATA_T tmrDataArray[5] = { 0 };

void TimerCallback( union sigval timer_data )
{
    std::cout<<"am i here\n";
    c = a + b;
}

int32_t CreateTimer( int32_t timerId, const uint32_t msPeriod )
{
    int32_t ret = -1;

    uint8_t slot = timerId;
    timer_t *tmrPtr = &tmrDataArray[slot].tmr;
    struct itimerspec period;
    uint32_t tmpPeriod;

    tmrDataArray[slot].tmrSigEvt.sigev_notify = SIGEV_THREAD;
    tmrDataArray[slot].tmrSigEvt.sigev_notify_function = TimerCallback;
    tmrDataArray[slot].tmrSigEvt.sigev_signo = timerId;
    tmrDataArray[slot].tmrSigEvt.sigev_value.sival_ptr = ( void* )&tmrDataArray[slot];
    tmrDataArray[slot].tmrSigEvt.sigev_notify_attributes = NULL;

    ret = timer_create( /*CLOCK_REALTIME*/ CLOCK_MONOTONIC, &tmrDataArray[slot].tmrSigEvt, tmrPtr );
    std::cout<<"----------------DO I COME HERE AFTER CREATING THE TIMER---------\n";


    tmpPeriod = msPeriod % 1000;    // remainder or period less than 1sec
    period.it_value.tv_nsec = ( long )( tmpPeriod * 1000000 );        // nano-seconds
    period.it_interval.tv_sec = 0;                                // non-repeating timer
    period.it_interval.tv_nsec = 0;
    ret = timer_settime( *tmrPtr, 0, &period, NULL );

    return ret;

}


int32_t DeleteTimer( int32_t timerId )
{
    int32_t ret = -1;
    sleep(10);
    if ( NULL != tmrDataArray[timerId].tmr )
    {
        ret = timer_delete( tmrDataArray[timerId].tmr );
         std::cout<<"Deleting the timer inside ------\n";
    }
    else
    {
        std::cout<<"failed to delete the timer\n";
    }
    return ret;
}




void *Create_Timer_thread1( void *ptr )
{
    std::cout<<"Creating a timer\n";
    CreateTimer( 2, 100 );
    std::cout<<"done creating a timer\n";
    return NULL;
}


void *Delete_Timer_thread2( void *ptr )
{
    std::cout<<"second thread deleting a timer\n";
    DeleteTimer(2);
    return NULL;
}




int main(int argc, char const *argv[])
{
    pthread_t thread1, thread2;
    int  iret1, iret2;

    iret1 = pthread_create( &thread1, NULL, Create_Timer_thread1, NULL);
    std::cout<<"creating the second thread\n";

    iret2 = pthread_create( &thread2, NULL, Delete_Timer_thread2, NULL);


    pthread_join( thread1, NULL);
    pthread_join( thread2, NULL); 

    std::cout<<"the value of c is: "<<c<<"\n";

    return 0;
}
c++ pthreads posix
1个回答
0
投票

访问和操作任何全局数据时需要同步线程。在你的情况下

c
tmrDataArray
。有多种方法可以实现这一目标。我建议您在访问时使用互斥锁
tmrDataArray
对于简单的数据类型,如
c
我建议您研究原子变量。

© www.soinside.com 2019 - 2024. All rights reserved.