以下のコードで、私の友人は、Linuxのコンテキスト切り替えとmutexロックでデッドロック状況を刺激しました。コンテキストスイッチは毎回動作しますか、予期しない動作が発生しますか?
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t l1, l2;
void* func1();
void* func2();
int main()
{
pthread_mutex_init(&l1, NULL);
pthread_mutex_init(&l2, NULL);
pthread_t t1, t2;
pthread_create(&t1, NULL, func1, NULL);
pthread_create(&t2, NULL, func2, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
}
void* func1()
{
pthread_mutex_lock(&l1);
printf("\nl1 locked in func 1"); // 1
sleep(1);
printf("\ntrying to Lock l2 in func 1"); // 2
pthread_mutex_lock(&l2);
}
void* func2()
{
pthread_mutex_lock(&l2);
printf("\nl2 locked in func 2"); // 3
sleep(1);
printf("\ntrying to Lock l1 in func 2"); // 4
pthread_mutex_lock(&l1);
}
問題は、実行後、それは声明1,3印刷され、4 しかし、正しい出力は、文1,3と2
されている必要があります。しかし、私はにfunc2の中で睡眠の値を変更するとき睡眠(4)それは正常に動作します。
私は文2と4を書かないと、文1が印刷された後に文1と文3が出力されます。
その後func2の睡眠を変更した後、(1)(4)スリープ状態に、スリープ状態に戻ってそれを切り替える(1)正しい動作状態となり...
は、この予期しない動作のすべてのですか理由がありますこれが起こっている... またはこれらのすべての動作を修正する簡単な解決策は私が理解するのに役立ちます。おかげさまで
私があなたのコードから見ることのできる唯一のことは、1が2の前に来て3が4の前に来ることです。それ以外は保証されません。 – Art
行の最後に '\ n'を移動する必要があります。そうしないと、stdoutバッファはフラッシュされず、デッドロック前の最後のメッセージは表示されません。 – mch
@mchはstdoutバッファを明示的にフラッシュする方法です – sharan