いいえ、これは間違っています。 pthread_mutex_lock
からのmanページ:
スレッドがロックされていないmutexやロック解除されたmutex、未定義の動作結果のロックを解除しようとした場合。
例正しい順序:T1はmyMutex(T2は現在ミューテックスをロック)
のロックを解除myMutex
T2ロックmyMutex(T1は、ミューテックスのロックを解除するのを待つブロック)
を
- T1ロックT2はmyMutexのロックを解除します
EDIT:
簡潔のために省略エラーチェックとpthread_cond_wait()
を使用して小さな例:
gcc -Wall -Werror -D_GNU_SOURCE main.c -o main -pthread
でコンパイル #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
volatile int value = 0;
pthread_mutex_t mymutex;
pthread_t thread_one;
pthread_t thread_two;
pthread_cond_t cond;
void* main_one(void* ignored)
{
while (value < 10)
{
pthread_mutex_lock(&mymutex);
pthread_cond_wait(&cond, &mymutex);
fprintf(stderr, "T1: value=%d\n", value);
pthread_mutex_unlock(&mymutex);
}
return (void*)0;
}
void* main_two(void* ignored)
{
int i;
for (i = 0; i < 10; i++)
{
pthread_mutex_lock(&mymutex);
value++;
fprintf(stderr, "T2: value=%d\n", value);
pthread_cond_broadcast(&cond);
fprintf(stderr, "Broadcasted but T1 cannot continue for 1 second\n");
sleep(1);
pthread_mutex_unlock(&mymutex);
pthread_yield();
}
return (void*)0;
}
void start_thread(void* (*a_entry_point)(void*),
pthread_t* a_handle)
{
pthread_attr_t thread_attributes;
pthread_attr_init(&thread_attributes);
pthread_attr_setdetachstate(&thread_attributes, PTHREAD_CREATE_JOINABLE);
pthread_create(a_handle, &thread_attributes, a_entry_point, 0);
}
int main()
{
pthread_mutexattr_t attr;
pthread_t thread_one_handle;
pthread_t thread_two_handle;
/* Init mutex. */
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
pthread_mutex_init(&mymutex, &attr);
/* Init condition. */
pthread_cond_init(&cond, 0);
/* Start threads. */
start_thread(main_one, &thread_one_handle);
start_thread(main_two, &thread_two_handle);
/* Wait for threads. */
pthread_join(thread_one_handle, 0);
pthread_join(thread_two_handle, 0);
/* Clean up. */
pthread_cond_destroy(&cond);
pthread_mutex_destroy(&mymutex);
return 0;
}
。
いいえ、これは、コードセクションがコードの別のセクションで中断されないようにするためのミューテックスを持つという全目的に反します。読んでいると、ロックされたコードだけがロックされるべきです。あなたは別の問題を抱えているように思えます。実際の問題を投稿し、正しい解決策を求めてください。 –
「しなければならない」は、控えめな表現です。ミューテックスは、現在そのスレッドを保持しているスレッドによってのみロックが解除されます。別のスレッドによってロック解除しようとすると、潜在的に非常に危険な未定義の動作が発生します。 –
"有効なアプローチ"とは何ですか?あなたは本当に何をしようとしていますか? –