【问题标题】:getting error with pthread mutex attributespthread 互斥体属性出错
【发布时间】:2013-06-21 04:46:12
【问题描述】:

当我在创建线程时将 pthread_mutex_attr 作为参数提供时,我遇到了问题。如果我将属性传递为 NULL 它工作正常,但不需要这个 NULL,

我在这里发布代码,请帮助我纠正我的错误并学习。

pthread_mutex_t thread_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_t thread1;

pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&thread_mutex, &attr);

ret = pthread_create(&thread1, NULL, my_func, (void *)message);
pthread_mutexattr_destroy(&attr);

pthread_mutex_destroy(&thread_mutex);
pthread_exit(NULL);

如果我像这样通过 attr

ret = pthread_create(&thread1,&attr,upload_data,(void *)message);

这导致分段错误。

【问题讨论】:

  • @Ulrich... 谢谢我试图完全像那样,但没有得到那种格式。我必须学习很多东西。 :)
  • 除了已经接受的答案,请注意您正在创建一个线程,它可能引用特定的互斥锁(否则,为什么那个互斥锁甚至在那里?),然后,在线程完成之前(即你还没有在上面调用pthread_join()),你破坏了那个互斥体并退出。即使它现在没有给你带来问题,但它可能会在未来咬你......

标签: multithreading


【解决方案1】:

我不确定你会得到什么样的错误,因为你从来没有具体说明你的问题是什么,但我假设你无法编译你的代码。

来自man pthread_create

   #include <pthread.h>

   int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                      void *(*start_routine) (void *), void *arg);

这说明pthread_create没有使用pthread_mutex_attr而是pthread_attr

【讨论】:

  • 在我们需要提供属性的地方,如果我通过NULL,就会创建线程。但我想要那个没有默认属性的互斥锁线程,但指定了一个。
  • 这是我尝试了解 Posix Thread 的链接。 computing.llnl.gov/tutorials/pthreads/#Mutexes
  • @Krishna 正如我所说,您的 attr 类型错误。 pthread_mutex_attr != pthread_attr。第一个 attr 用于确定线程特定设置(堆栈大小等)。如果要将互斥锁传递给函数,则必须将其传递到 arg 而不是 attr
猜你喜欢
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
相关资源
最近更新 更多