【发布时间】:2013-12-21 12:22:30
【问题描述】:
我目前正在尝试分析第三方源代码中的一个问题,其中线程(代码 sn-p 对应于THREAD-T1)处于无限等待状态。怀疑是线程卡在pthread_cond_wait。以下是相同的细节。
代码说明
- T1 对 T2 公开的 API 进行异步调用。
- 因此 T1 在条件变量(例如
cond_t)上移动到阻塞等待。 - 条件变量
cond_t在 T2 生成的回调事件中发出信号。 - 上述循环重复
n次,直到 API 返回成功。
为了巩固,上面是通过使用条件变量使异步调用类似于同步调用的一系列步骤。
示例代码
#define MAX_RETRY (3)
bool g_b_ret_val;
pthread_mutex_t g_cond_mutex;
pthread_mutex_t g_ret_val_mutex; /* Assume iniitailzed in the main thread */
pthread_cond_t g_cond_t; /* Assume iniitailzed in the main thread */
retry_async_call_routine() /* Thread-T1 */
{
while(( false == g_b_ret_val) && (retry < MAX_RETRY))
{
(void)invoke_async_api();
pthread_mutex_init(&g_cond_mutex, NULL);
pthread_mutex_lock(&g_cond_mutex);
pthread_cond_wait(g_cond_t, &g_cond_mutex);
pthread_mutex_unlock(&g_cond_mutex);
pthread_mutex_destroy(&g_cond_mutex);
retry ++ ;
}
}
callback_routine() /* Thread-T2 */
{
pthread_mutex_lock(&g_ret_val_mutex);
g_b_ret_val = true; /* May be false also on failure */
pthread_mutex_unlock(&g_ret_val_mutex);
pthread_cond_signal(&g_cond_t);
}
我在代码中看到的已知问题
-
pthread_cond_wait上的 while 循环中缺少对条件的重新测试 - 发出信号时缺少互斥锁
问题
- 请指出任何更多的循环漏洞(或)无限等待的可能性(如果有)。
-
g_cond_t在连续等待之间没有使用pthread_cond_destroy重置,相同的行为是什么? (有关此的任何参考)
【问题讨论】:
标签: c multithreading synchronization pthreads