【问题标题】:pthread in C, incompatible typeC中的pthread,不兼容的类型
【发布时间】:2013-03-27 11:56:04
【问题描述】:

编译时出现这个错误

expected 'union pthread_mutex_t *' but argument is type of 'pthread_mutex_t'

1) 'union pthread_mutex_t *' 和 'pthread_mutex_t' 有什么区别?
2) 我如何将 'pthread_mutex_t' 变成正确的参数?

void buffer_insert(int number)
{
  pthread_mutex_t padlock;
  pthread_cond_t non_full;
  pthread_mutex_init(&padlock, NULL);
  pthread_cond_init(&non_full, NULL);
  if(available_buffer()){
    put_in_buffer(number);
  } else {
    pthread_mutex_lock(padlock);
    pthread_cond_wait(non_full, padlock);
    put_in_buffer(number);
    pthread_mutex_unlock(padlock);
    pthread_cond_signal(non_empty);
  }
}

【问题讨论】:

  • 想展示一些代码吗?
  • pthread_mutex_lock(&padlock);pthread_cond_wait(&non_full, &padlock);pthread_mutex_unlock(&padlock); 等... 大多数 pthread 函数通过地址获取参数;只有少数没有。
  • NPE 已经解释了指针部分,对于 'union' 关键字,您可以假设不同数据类型和可能不同大小的变量可能会共享相同的内存位置(这通常用于 int , unsigned, float, long 等共享一个内存位置)。这是一种方便的技术,人们不希望将一段数据限制为特定类型。
  • 该代码不会“锁定”任何东西 - 因为padlock 是一个局部变量buffer_insert() 的每次调用都将使用一个不同的 锁定。请不要这样编码。
  • @FrankH。是的,我很久以前就修好了。现在一切正常

标签: c pthreads


【解决方案1】:

中的星号

int pthread_mutex_lock(pthread_mutex_t *mutex);

表示该函数将pointer 转换为pthread_mutex_t

您需要获取互斥变量的地址,即在调用函数时将padlock 替换为&padlock

例如,

pthread_mutex_lock(padlock);

应该阅读

pthread_mutex_lock(&padlock);

等等(对于互斥体和条件变量)。

还值得注意的是,在您显示的代码中,padlocknon_full 是函数的本地函数,每次调用函数时都会创建和销毁。因此不会发生同步。您需要重新考虑如何声明和初始化这两个变量。

代码还有其他问题。例如,您使用条件变量的方式在几个方面存在缺陷。

考虑到这一点,我建议遵循 pthreads 教程。

【讨论】:

  • -1 表示“应该阅读”。太短视了。代码被破坏了,仅仅通过编译它还不能使它工作。
猜你喜欢
  • 2011-07-07
  • 1970-01-01
  • 2012-09-02
  • 2013-05-15
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多