1
トピックを検索したときに、コードがhereから見つかりました。ご覧のように、両方の関数のスレッドは同じmutex
を使用します。それで、たとえ先のスレッドがmutexを所有していても、他のスレッドに信号を送るか、信号を捕まえてその機能を続けることができますか?どのようにデッドロックがないのですか?それはちょっと混乱します。Pthread条件変数とデッドロックなし
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t count_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condition_var = PTHREAD_COND_INITIALIZER;
void *functionCount1();
void *functionCount2();
int count = 0;
#define COUNT_DONE 10
#define COUNT_HALT1 3
#define COUNT_HALT2 6
main()
{
pthread_t thread1, thread2;
pthread_create(&thread1, NULL, &functionCount1, NULL);
pthread_create(&thread2, NULL, &functionCount2, NULL);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
printf("Final count: %d\n",count);
exit(EXIT_SUCCESS);
}
// Write numbers 1-3 and 8-10 as permitted by functionCount2()
void *functionCount1()
{
for(;;)
{
// Lock mutex and then wait for signal to relase mutex
pthread_mutex_lock(&count_mutex); // <---- Same mutex
// Wait while functionCount2() operates on count
// mutex unlocked if condition varialbe in functionCount2() signaled.
pthread_cond_wait(&condition_var, &count_mutex);
count++;
printf("Counter value functionCount1: %d\n",count);
pthread_mutex_unlock(&count_mutex);
if(count >= COUNT_DONE) return(NULL);
}
}
// Write numbers 4-7
void *functionCount2()
{
for(;;)
{
pthread_mutex_lock(&count_mutex); // <---- Same mutex
if(count < COUNT_HALT1 || count > COUNT_HALT2)
{
// Condition of if statement has been met.
// Signal to free waiting thread by freeing the mutex.
// Note: functionCount1() is now permitted to modify "count".
pthread_cond_signal(&condition_var);
}
else
{
count++;
printf("Counter value functionCount2: %d\n",count);
}
pthread_mutex_unlock(&count_mutex);
if(count >= COUNT_DONE) return(NULL);
}
}
あなたは私が尋ねるものを理解していません。私はどちらも同じミューテックスを使用することを頼みます。もしそれらのうちの1つが許可を所有していれば、もう1つはミューテックスエリアに入るのを待たなければなりません。その場合、functionCount1では、thread1が所有するmutexとpthread_cond_waitが進行中です。この行では、functionCount2(Thread 2)を待っていますか?または、thread2がmutexを所有している場合、thread1はどのようにカウントをインクリメントできますか?ミューテックスがすでにthread2によって所有されていても? – concurrencyboy
しかしデッドロックのないチャームのように機能しますか? – concurrencyboy
@concurrencyboy今すぐお試しください。あなたが混乱させたのは、スレッドAが 'cond_wait'を実行するとロックを解放するという事実でした。それ以外の場合は、スレッドAが最初にロックを取得するシナリオではデッドロックになります。 –