Как заставить блокировки быть освобожденными в одном потоке, которые были установлены другим - PullRequest
0 голосов
/ 22 августа 2010

У меня есть простой пул потоков, написанный на pthreads, реализованный с использованием пула блокировок, поэтому я знаю, какие потоки доступны.У каждого потока также есть условная переменная, которую он ожидает, поэтому я могу дать ему сигнал на выполнение работы.

Когда работа наступает, я выбираю поток, просматривая поиск доступного потока из пула блокировок.Затем я устанавливаю структуру данных, связанную с потоком, которая содержит работу, которую он должен выполнить, и сигнализирую переменной условия, что поток должен начать работать.

Проблема заключается в том, что поток завершает работу.Мне нужно разблокировать поток в пуле блокировок, чтобы он был доступен для дополнительной работы.Однако управляющий поток - это тот, который устанавливает блокировку, поэтому поток не может освободить эту блокировку сам.(И управляющий поток не знает, когда работа завершена.)

Есть предложения?

Я мог бы реорганизовать свой пул потоков, чтобы использовать очередь, в которой все потоки сигнализируются при работедобавлено, так что один поток может получить его.Однако в будущем сходство потоков, вероятно, станет проблемой для входящей работы, и пул блокировок облегчит реализацию этого.

1 Ответ

0 голосов
/ 22 августа 2010

Мне кажется, что часть данных, к которой вы пытаетесь синхронизировать доступ, является статусом «свободен / занят» каждого потока.

Итак, есть таблица (массив), в которой записываются свободные /состояние занятости каждого потока и использование мьютекса для защиты доступа к этой таблице.Любой поток (контроллер или рабочий), который хочет проверить / изменить состояние потока, должен захватить мьютекс, но блокировку необходимо удерживать только во время проверки / изменения состояния, а не на всю продолжительность работы потока.

Чтобы назначить работу потоку, вы должны сделать:

pthread_mutex_lock(&thread_status_table_lock);
-- search table for available thread
-- assign work to that thread
-- set thread status to "busy"
pthread_mutex_unlock(&thread_status_table_lock);
-- signal the thread

И когда поток завершит свою работу, он изменит свой статус обратно на "свободный":

pthread_mutex_lock(&thread_status_table_lock);
-- set thread status to "free"
pthread_mutex_unlock(&thread_status_table_lock);
...