1

我们已经获得了一些代码来查看以准备有关 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);
}

非常感谢任何反馈。

4

1 回答 1

2

看起来将pthread_mutex_unlock函数推送到线程清理堆栈的代码通过pthread_cleanup_push使代码片段工作,因为否则线程将获取共享锁并被迫退出而不释放它。

通过将pthread_mutex_unlock函数压入清理堆栈,线程确保在线程退出时互斥锁将被解锁,即使强制退出并且pthread_cleanup_pop函数未命中也是如此。

本质上,清理队列使您能够确保在退出时执行代码/释放资源等。只调用清理堆栈上的pthread_cleanup_pop function顶部函数,而退出调用清理堆栈上的所有函数。pthread_cleaup_push有关更多信息,请参见该人。

于 2012-08-13T17:50:25.710 回答