2012-09-29 9 views
6

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

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

正確にどこが間違っているのか教えてください。

+2

をおそらくあなたは 'int型*カウンタ= counter_addr'と' ++ * counter'を望んでいました。 –

答えて

10

mutexをロックしようとしています。max回、次にcounterを増分して一度リリースしてください。

試してください:あなたがしようとしたものを多分ある

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

Ohh ..それは悪いプログラミングエラーでした。それを指摘してくれてありがとう。 :) –

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以上のスレッドが唯一のグローバルスコープのデータや ヒープ上にあるデータを共有する(malloc) 。
  • 2つ以上のスレッドがスタック上で定義された変数を共有しないこの データは各スレッドに固有であり、ロックする必要はありません。

あなたは原則としてin the answers何を共有していると何を共有されていないなど

0

を読み取るために歓迎され、同じスレッドが複数回ミューテックスをロックしてはならない、それはここで何が起こったのです。

0

ロックの初期化は非常に重要です。ロックを正しい値に初期化しないと、コードが壊れます。あなたのロックを初期化するための一つの方法は以下の通りです:

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 

また、あなたは、次のコードを使用して動的にこの作業を行うことができます。あなたはpthread_mutex_lockのリターンコードをチェックする必要があり、ロックの初期設定の横に

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

をそれが失敗したかどうかを確認するために、失敗したかのように、複数のスレッドがクリティカルセクションに入ることができます。この目的のために、あなたは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); 
} 
関連する問題