6

上記のコードを使用して、2つのスレッドを使用してカウンターをインクリメントしています。これらのスレッドは、独立してmutロックとインクリメントカウンターを取得します。スレッドがこの関数に入った後、デッドロックに直面しています。

 pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;

 void *increment_counter(void *counter_addr)
{
    int max = MAX_COUNTER_VALUE;
    int iter;
    int counter;

    for(iter=0;iter< max ;iter++)
   // LOCK  
    pthread_mutex_lock(&mut);
    counter++;
    // UNLOCK 
    pthread_mutex_unlock(&mut);
    return NULL; 
}

誰かが私がどこで間違っているのか教えてもらえますか?

4

4 に答える 4

14

ミューテックスmax時間をロックしてから、インクリメントcounterしてリリースします。

試す:

for(iter=0;iter< max ;iter++)
{
  // LOCK  
  pthread_mutex_lock(&mut);
  counter++;
  // UNLOCK 
  pthread_mutex_unlock(&mut);
}
return NULL; 
于 2012-09-29T06:49:17.640 に答える
3

それはおそらくあなたがやろうとしたことです:

int max = MAX_COUNTER_VALUE;
int iter;
int counter;
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;

void *increment_counter(void *counter_addr)


{

  pthread_mutex_lock(&mut);    
  for(iter=0;iter< max ;iter++)  
       counter++;
  pthread_mutex_unlock(&mut);
  return NULL; 
}
  • 2 つ以上のスレッドは、グローバル スコープ データまたは heap( malloc) 上にあるデータのみを共有します。
  • 2 つ以上のスレッドがスタックで定義された変数を共有していません。このデータは各スレッドに固有であり、ロックする必要はありません。

共有されているものと共有されていないものなどの回答を読むことを歓迎します.

于 2012-09-29T06:51:47.073 に答える
0

原則として、同じスレッドがミューテックスを複数回ロックするべきではありません。それがここで起こったことです。

于 2012-09-29T09:25:24.923 に答える
0

ロックの初期化は非常に重要です。ロックを正しい値に初期化しないと、コードが壊れます。ロックを初期化する 1 つの方法は次のとおりです。

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

また、次のコードを使用して、このタスクを動的に実行できます。

int rc = pthread_mutex_init(&lock, NULL);
assert(rc == 0); // always check success!

ロックの初期化に加えてpthread_mutex_lock、複数のスレッドがクリティカル セクションに入る可能性があるため、失敗したかどうかを確認するために のリターン コードをチェックする必要があります。この目的のために、次のような戻りコードをチェックするコードを使用できますpthread_mutex_lock

// Use this to keep your code clean but check for failures
// Only use if exiting program is OK upon failure
void Pthread_mutex_lock(pthread_mutex_t *mutex) {
int rc = pthread_mutex_lock(mutex);
assert(rc == 0);
}
于 2013-10-26T21:16:53.107 に答える