#c #multithreading #operating-system #sleep
#c #многопоточность #операционная система #сон
Вопрос:
Как я могу снять блокировку потока, когда он спит?
Когда я вызываю pthread_join() , он будет работать нормально, но мне нужно создать более одного потока, и я не могу вызвать pthread_join() из-за их параллелизма. Как я могу решить эту проблему, не вызывая join .
pthread_mutex_t mut1;
pthread_mutex_init(amp;mut1, NULL);
void* funA(void* arg){
while(pthread_mutex_trylock(amp;mut1) != 0);
sleep(10);
// resources sharing
pthread_mutex_unlock(amp;mut1);
pthread_exit(NULL);
}
int main(){
pthread_t id[9];
for(int i = 0; i<9; i ){
pthread_create(amp;id[i], NULL, amp;funA, NULL);
}
}
Комментарии:
1. Я не понимаю. Почему вы не можете просто освободить мьютекс перед сном и повторно получить его после?
2. Поток никогда не должен переходить в спящий режим, удерживая блокировку.
3. Я не могу освободить, а затем повторно запросить мьютекс. В моем проекте я делаю это для проверки синхронизации. поэтому, когда поток спит, они неправильно используют ресурсы.
4. Что это значит «… для проверки синхронизации?» Если вы надеетесь написать автоматический тест, который завершится неудачей, если код не будет синхронизирован должным образом, тогда удачи в этом! Тестирование на наличие ошибок синхронизации практически невозможно. Неправильно синхронизированный код никогда не гарантирует плохого поведения. Если код проходит в вашем тестовом жгуте, это не гарантирует, что он не завершится сбоем на сайте клиента.
5. Вызов
pthread_join()
является обязательным — вы не можете пропустить его и ожидать, что ваша программа будет работать правильно. Вызовитеpthread_join
второй цикл formain()
после завершения вашего первого цикла for. Это даст вам как параллелизм, так и чистый выход.