私のスレッド学習テストのコードは次のとおりです。
int mylock = 0;
void *r1(void *x)
{
puts("entered r1");
int *p;
p = (int *)x;
int i = *p;
sleep(1);
*p = --i;
printf("r1: %d\n",*p);
mylock = 1;
printf("r1: done\n");
#ifdef USETHREADS
pthread_exit(0);
#endif
}
void *r2(void *x)
{
puts("entered r2");
if (!mylock) {
puts("r2 is waiting...");
while (!mylock)
printf("");
}
int *p;
p = (int *)x;
int i = *p;
*p = ++i;
sleep(1);
printf("r2: %d\n",*p);
printf("r2: done\n");
#ifdef USETHREADS
pthread_exit(0);
#endif
}
main()
{
int i1,i2;
i1 = 1;
i2 = 2;
printf("i1: %d\n", i1);
#ifdef USETHREADS
pthread_t r1_thread, r2_thread;
pthread_create(&r1_thread, NULL, r1, &i1);
pthread_create(&r2_thread, NULL, r2, &i1);
pthread_join(r1_thread, NULL);
pthread_join(r2_thread, NULL);
#else
r1(&i1);
r2(&i1);
#endif
printf("i1: %d\n", i1);
return 0;
}
したがって、2 つのスレッド、1 つは i1 を増加させ、もう 1 つは減少させます (pthreads の「ミューテックス」は認識していますが、現時点では使用していません)。競合状態を回避するために、mylock を作成します (これはミューテックスを偽造していると思います)。 mylock が値を変更するのを待っている間に、プロセスが未定義ループに陥ってしまうのですか? 待機ループで呼び出さない限りprintf
、printf 呼び出しで予想どおり 2 秒で終了します。それは Linux のミステリーですか?