Синхронизация потоков в Linux? - PullRequest
       77

Синхронизация потоков в Linux?

0 голосов
/ 16 сентября 2018

Я пишу код, в котором заставляю свои потоки ждать, пока я не сделаю pthread_cond_broadcast. У меня есть три темы в этом коде. Потоки line2_thread и line3_thread, работают в порядке их приоритета, как они должны работать. Тем не менее, мой третий поток даже не входит в свою функцию потока (line4_thread). Может кто-нибудь сказать мне, почему мой main () не может вызвать мой line4_thread? pthread_cond_t sstart; pthread_mutex_t sstart_mutex;

void *l3_thread(void *arg){

pthread_mutex_lock(&sstart_mutex);
pthread_cond_wait(&sstart, &sstart_mutex);
pthread_mutex_unlock(&sstart_mutex);
/*do something*/

pthread_exit(NULL);

}

void *l2_thread(void *arg){

pthread_mutex_lock(&sstart_mutex);
pthread_cond_wait(&sstart, &sstart_mutex);
pthread_mutex_unlock(&sstart_mutex);
/*do something*/

pthread_exit(NULL);

}


void *l4_thread(void *arg){

pthread_mutex_lock(&sstart_mutex);
pthread_cond_wait(&sstart, &sstart_mutex);
pthread_mutex_unlock(&sstart_mutex);
/*do something*/

pthread_exit(NULL);

}

int main(){

pthread_cond_init(&sstart, NULL);

//thread creation

pthread_cond_broadcast(&sstart);
pthread_cond_destroy(&sstart);
    pthread_mutex_destroy(&sstart_mutex);

return 0;
}

1 Ответ

0 голосов
/ 16 сентября 2018

Я думаю, у вас есть несколько проблем здесь.С извинениями (я нахожусь на моем телефоне, поэтому набрать длинный ответ сложно) Я просто сосредоточусь на паре вещей, так как мне не на 100% ясно, что вы на самом деле пытаетесь сделать.

Когда все ваши потоки запускаются, они все пытаются получить мьютекс, и только один из них успешен.Возможно, но я не думаю, что здесь это гарантировано.Затем он вызывает pthread_cond_wait и разблокирует мьютекс, позволяя одному из других потоков достичь его pthread_cond_wait.Но пока.Вы позволили вашему основному потоку вызывать pthread_cond_broadcast, и вы не предприняли никаких шагов для синхронизации этого с другими потоками.Это может произойти до того, как другие будут разблокированы в ожидании мьютекса, и до их wait вызова, чтобы они могли пропустить сигнал и заблокировать навсегда.

Кроме того, я думаю, что немного набросать, чтобы немедленно вызвать pthread_cond_destroy.Как я уже говорил, синхронизация между вашим основным потоком и рабочими потоками отсутствует, поэтому возможно, что вы могли бы вызвать pthread_cond_broadcast, а затем pthread_cond_destroy, поэтому некоторые из ваших потоков могут вызывать pthread_cond_wait из-за недопустимой переменной условия и взаимоблокировки.

Проверьте возвращаемые значения pthread_cond_wait.Если я прав, в некоторых случаях он может вернуть EINVAL.Но я не проверял это, поэтому в моих рассуждениях может быть недостаток.

...