2010-08-21 1 views
0

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

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

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

Любые предложения?

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

+0

Использование Pthreads API - это возможность определить состояние выполнения конкретного потока, например ли поток завершил свою работу? –

ответ

0

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

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

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

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); 
+0

Это в основном отвечало на мой вопрос. Я понял, что существует фундаментальный недостаток в том, как я реализовал свой пул. Вместо того, чтобы иметь набор блокировок для каждого элемента в пуле, у меня должна быть одна блокировка, а затем набор переменных состояния. Это, вероятно, будет намного более эффективным. Спасибо! –

Смежные вопросы