我陷入了一种特殊的情况,我从一个线程调用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
和tmrDataArray
。有多种方法可以实现这一目标。我建议您在访问时使用互斥锁 tmrDataArray
对于简单的数据类型,如 c
我建议您研究原子变量。