我们已经获得了一些代码来查看以准备有关 pthread 的考试并正确取消它们。我们被要求解释什么是错误的,并修复它。
我的回答:线程处理函数进入等待状态而不释放互斥体,但我觉得我错过了一些东西。这是代码,添加了添加清理处理程序的行以修复程序。同样,我不太确定为什么会这样。(我了解清理处理程序的概念,但我不明白为什么它解决了这个特定问题 - 我不确定我的答案是否正确的另一个原因)
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cv = PTHREAD_COND_INITIALIZER;
const int flag = 1;
static void * cancelme(void *bb_in)
{
pthread_mutex_lock(&mutex);
/* Install a cleanup handler */
pthread_cleanup_push(pthread_mutex_unlock, &mutex);
while (flag) {
pthread_cond_wait(&cv, &mutex);
}
//before insertion of cleanup handlers: pthread_mutex_unlock(&mutex); was here
/* Uninstall cleanup handler */
pthread_cleanup_pop(1);
return (NULL);
}
int main()
{
pthread_t t;
pthread_create(&t, NULL, cancelme, NULL);
sleep(1);
pthread_cancel(t);
printf("Waiting for thread to finish...\n");
pthread_join(t, NULL);
printf("Thread finished...\n");
printf("Waiting to acquire lock...\n");
pthread_mutex_lock(&mutex);
printf("Lock acquired\n");
return (0);
}
非常感谢任何反馈。