c - 使用心跳信号在c中进行线程监控

标签 c multithreading monitoring

我想监控线程。为此,我使用了条件变量来发送和接收心跳信号和确认信号。
scnMonitor_t 是一个监视器结构。当添加新线程时,它会向监视器注册并添加到 scnThreadlist_t。 monitorHeartbeatCheck是程序启动的线程, monitorHeartbeatProcess 是添加到所有线程函数的 API。

其实我的问题是没有正确遵循进程的索引 它以第 3 个线程的等待 HB 条件结束并创建死锁。 应该是什么问题?
提前致谢。

typedef struct scnThreadList_{
        osiThread_t     thread;
        struct scnThreadList_   *next;
} scnThreadList_t;

typedef struct scnMonitor_{
        bool            started;
        osiThread_t     heartbeatThread; 
        osiMutex_t      heartbeatMutex;
        osiMutex_t      ackMutex;
        osiCond_t       heartbeatCond;
        scnThreadList_t *threads;
} scnMonitor_t; 
static scnMonitor_t *s_monitor = NULL;

// Main heartbeat check thread
void* monitorHeartbeatCheck( void *handle )
{
        scnThreadList_t *pObj = NULL;
        static int idx = 0;
        static bool waitAck = false;

        while ( 1 ) { 
                pObj = s_monitor->threads;
        while ( pObj && ( pObj != s_monitor->heartbeatThread ) ) { //skip it-self from monitoring.
                ++idx;
                printf("\"HB Check No.%d\"\n",idx);
                // send heartbeat
                usleep( 250 * 1000 );
                pthread_mutex_lock( s_monitor->heartbeatMutex, 1 );
                pthread_cond_signal( s_monitor->heartbeatCond );    
                printf("-->C %d HB sent\n",idx);
                pthread_mutex_unlock( s_monitor->heartbeatMutex );
                // wait for ACK
                while( !waitAck ){
                        pthread_mutex_lock( s_monitor->ackMutex, 1 );
                        printf("|| C %d wait Ack\n",idx);
                        waitAck = true;
                        pthread_cond_wait( s_monitor->heartbeatCond, s_monitor->ackMutex );
                        waitAck = false;
                        printf("<--C %d received Ack\n",idx);
                        pthread_mutex_unlock( s_monitor->ackMutex );
                        LOG_INFO( SCN_MONITOR, "ACK from thread %p \n", pObj->thread );
                }
                        pObj = pObj->next;
                }
        } // while, infinite
        return NULL;
}

// Waits for hearbeat and acknowledges
// Call this API from every thread function that are registered
int monitorHeartbeatProcess( void )
{
        static int id = 0;
        static bool waitHb = false;
        ++ id;
        printf("\"HB Process No.%d\"\n",id);
        // wait for HB
        while(!waitHb){
                pthread_mutex_lock( s_monitor->heartbeatMutex, 1 );
                printf("|| P %d wait for HB\n",id);
                waitHb = true;
                pthread_cond_wait( s_monitor->heartbeatCond, s_monitor->heartbeatMutex );
                waitHb = false;
                printf("<--P %d HB received \n",id);
                pthread_mutex_unlock( s_monitor->heartbeatMutex );
        }
        // send ACK
        uleep( 250 * 1000 );
        pthread_mutex_lock( s_monitor->ackMutex, 1 );
        pthread_cond_signal( s_monitor->heartbeatCond );
        printf("-->P %d ACK sent\n",id);
        pthread_mutex_unlock( s_monitor->ackMutex );
        return 1;
}

最佳答案

您应该总是一次只将一个互斥锁与一个条件相关联。同时使用具有相同条件的两个不同互斥量可能会导致您的应用程序出现不可预测的序列化问题。

http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Fapis%2Fusers_78.htm

您的条件 heartbeatCond 有 2 个不同的互斥锁。

关于c - 使用心跳信号在c中进行线程监控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8413227/

相关文章:

c - scanf ("%[^\n]d", x) 或 scanf ("%[0-9]d", x) 将 1 变为 49 并将 2 变为 50

c - 这个函数的结果是什么?

php - 在 PHP 中创建新线程(?)

c - 错误 : array subscript has type 'char' in a function (C)

c++ - 球 jar 容积的最终答案无效

c - 为什么 Helgrind 显示 "lock order violated"错误消息?

multithreading - 轻量级互斥

c# - 以编程方式监视/监视数据库(事件)

java - hdr 直方图足迹如何保持恒定

java - 如何监视 Java EE 应用程序中的文件更改?