Здравствуйте.
В приведенном ниже коде в NPTL потоки планируются таким образом, что "работает" только первый поток, второй блокируется при попытке захватить мьюьекс.
Если раскомментировать строку pthread_yield, то все в порядке: работают оба потока (вместо pthread_yield можно, например, usleep).
В LinuxThread в подобного рода коде мне никогда не приходилось думать ни о каких yield-ах.
Для меня это загадка. Что не так? Подскажите, плиз.
Slackware 12.0 (2.6.21.5)
glibc 2.5 (соответственно и NPTL 2.5)
Спасибо.
---------------------------------------------------------
void *run(void *arg)
{
pthread_mutex_t *m = (pthread_mutex_t *)arg;
for (;;) {
pthread_mutex_lock(m);
printf("[%lu] Do something...\n", pthread_self());
pthread_mutex_unlock(m);
// pthread_yield();
}
return NULL;
}
int main()
{
pthread_mutex_t m;
pthread_t t1, t2;
pthread_mutex_init(&m, NULL);
pthread_create(&t1, NULL, run, (void *)&m);
pthread_create(&t2, NULL, run, (void *)&m);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
exit(0);
}