54

pthread を使用して再帰的ミューテックスを宣言する方法について、少し混乱しています。私がやろうとしているのは、一度に 1 つのスレッドだけがコード (関数を含む) を実行できるようにすることですが、懐疑的な見方をした後、ミューテックスの使用は機能せず、代わりに再帰ミューテックスを使用する必要があることがわかりました。これが私のコードです:

pthread_mutex_lock(&mutex);                   // LOCK

item = queue_peek(queue);                     // get last item in queue
item_buff=item;                               // save item to a buffer
queue_removelast(queue);                      // remove last item from queue

pthread_mutex_unlock(&mutex);                 // UNLOCK

だから私がやろうとしているのは、キューから順番に読み取り/削除することです。

問題は、再帰的ミューテックスを宣言する方法に関する例がそこにないということです。または、いくつかあるかもしれませんが、それらは私のためにコンパイルされません。

4

4 に答える 4

90

Michael Foukarakis のコードはほとんど問題ありませんが、彼はミューテックスを 2 回初期化し、未定義の動作につながります。次のようにする必要があります。

pthread_mutex_t Mutex;
pthread_mutexattr_t Attr;

pthread_mutexattr_init(&Attr);
pthread_mutexattr_settype(&Attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&Mutex, &Attr);

私は実際にこのコードを本番環境で使用しており、Linux、Solaris、HP-UX、AIX、Mac OSX、および FreeBSD で正しく動作することを知っています。

これをコンパイルするには、適切なリンカー フラグも追加する必要があります。

AIX, Linux, FreeBSD:
CPLATFORM += -pthread

mingw32:
LDFLAGS += -lpthread
于 2011-11-01T07:53:17.773 に答える
18

再帰的ミューテックスを作成するには、次を使用します。

#include <pthread.h>
int pthread_mutexatttr_settype(pthread_mutexattr_t *attr,
                               int type);

タイプはPTHREAD_MUTEX_RECURSIVEです。

戻り値の確認を忘れずに!

例:

/* or PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP */
pthread_mutex_t       mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutexattr_t   mta;

または、実行時に初期化します (両方を実行しないでください。未定義の動作です)。

pthread_mutexattr_init(&mta);
/* or PTHREAD_MUTEX_RECURSIVE_NP */
pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_RECURSIVE);

pthread_mutex_init(&mutex, &mta);
于 2011-08-12T08:35:41.433 に答える
17

Linux では (ただし、これは他のシステムには移植できません)、ミューテックスがグローバル変数または静的変数である場合、次のように初期化できます。

static pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;

(ちなみに、例はpthread_mutex_init(3) manページからのものです!)

于 2011-10-28T19:42:53.390 に答える
2

ミューテックスを作成するときに、ミューテックス属性を追加する必要があります。

を呼び出してpthread_mutexattr_initから、これらの属性を で使用しpthread_mutexattr_settypeます。詳細については、こちらをお読みください。PTHREAD_MUTEX_RECURSIVEpthread_mutex_initman pthread_mutexattr_init

于 2011-08-12T08:37:31.413 に答える