3

コンパイル中に、このエラーが発生しました

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);
  }
}
4

1 に答える 1

6

のアスタリスク

int pthread_mutex_lock(pthread_mutex_t *mutex);

関数がへのポインタを取ることを意味しますpthread_mutex_t

ミューテックス変数のアドレスを取得する必要があります。つまり、関数を呼び出すときにで置き換えpadlockます&padlock

例えば、

pthread_mutex_lock(padlock);

読む必要があります

pthread_mutex_lock(&padlock);

など(ミューテックスと条件変数の両方)。

padlockまた、表示するコードでは、関数に対してローカルでありnon_full、関数が呼び出されるたびに作成および破棄されることにも注意してください。したがって、同期は行われません。2つの変数を宣言して初期化する方法を再考する必要があります。

コードにはさらに問題があります。たとえば、条件変数の使用方法にはいくつかの点で欠陥があります。

これを念頭に置いて、pthreadsチュートリアルに従うことをお勧めします。

于 2013-03-27T11:57:43.353 に答える