Мьюьтексы, семафоры, потоки...
Jan. 27th, 2014 11:45 pmСтатьи на русском по многопоточному программированию пишут какие-то наркоманы, нихрена непонятно.

Фак мой моск...
Стоит примитивная задача, при определённом событии заблокировать поток (или функцию хотя бы), и после второго события разрешить ей работу. При чём события могут происходить в разных местах.
Начал читать, и утонул во мьютексах, спин блокировках и т.п. Жесть, как она есть.
З.Ы. Хотя многопоточное программирование - это ништяк.

Фак мой моск...
Стоит примитивная задача, при определённом событии заблокировать поток (или функцию хотя бы), и после второго события разрешить ей работу. При чём события могут происходить в разных местах.
Начал читать, и утонул во мьютексах, спин блокировках и т.п. Жесть, как она есть.
З.Ы. Хотя многопоточное программирование - это ништяк.
no subject
Date: 2014-01-27 08:22 pm (UTC)no subject
Date: 2014-01-27 08:28 pm (UTC)no subject
Date: 2014-01-27 08:32 pm (UTC)no subject
Date: 2014-01-27 08:50 pm (UTC)no subject
Date: 2014-01-27 09:02 pm (UTC)Искать нужно используя лозу!
Ну или на крайняк - вогнутую проволоку! %))
no subject
Date: 2014-01-27 09:05 pm (UTC)В определённом месте проверить событие и стопнуться или тормознуть исполнение невзирая на то что сейчас выполняется?
Если второе - это сигналы смотреть нужно.
А вообще нужно больше деталей чтобы понять что и как делать.
no subject
Date: 2014-01-27 09:10 pm (UTC)no subject
Date: 2014-01-27 09:20 pm (UTC)no subject
Date: 2014-01-27 09:21 pm (UTC)no subject
Date: 2014-01-27 09:26 pm (UTC)no subject
Date: 2014-01-27 09:27 pm (UTC)Ну или, сделать тоже самое с помощью блокировок.
no subject
Date: 2014-01-28 02:42 am (UTC)no subject
Date: 2014-01-28 04:38 am (UTC)no subject
Date: 2014-01-28 05:01 am (UTC)no subject
Date: 2014-01-28 05:17 am (UTC)Как вариант - отрисовка меню - в критической секции, окружаем ее мьютексами. Пока рабочий процесс занимается отрисовкой, управляющие не может слать данные. Т.е., грубо говоря, я это так вижу, в метокоде:
sem dataSend;
mutex dataInProcess;
управляющий:
mutex.lock(dataInProcess);
(...send to buf...)
mutex.unlock(dataInProcess);
sem.signal();
рабочий:
for (;;)
{
...if (sem.acquire(timeout)
...{
......mutex.lock(dataInProcess);
......(...read from buf...)
......mutex.unlock(dataInProcess);
...}
...(...draw...)
}
upd. жежешечка табуляцию порезала, но, я думаю, суть ясна
no subject
Date: 2014-01-28 06:08 pm (UTC)Ну или если код примерно такой:
while(true)
{
sleep(T);
send_data();
}
То достаточно send_data внутрь блокировки взять:
while(true)
{
sleep(T);
mutex_lock()
send_data()
mutex_unlock();
}
А в обработчике события тоже самое:
{
mutex_lock();
show_and_work_with_menu();
mutex_unlock();
}
ЗЫ. Вроде ж в литературе все есть? Взять например "Теренс Чан - Системное программирование на C++ в Unix" вполне понятно написано как по мне. Или вот Стивенс У. UNIX. Профессиональное программирование. (http://padabum.com/d.php?id=16369) Вторая пожалуй даже получше будет.
no subject
Date: 2014-01-28 07:38 pm (UTC)void *show_current_track() { while (1) { pthread_mutex_lock(&mutex); .... Некий код, который нельзя прерывать ... pthread_mutex_unlock(&mutex); usleep (500000); } ... И далее в другой функции делаю так: void tuning_action() { .... pthread_mutex_lock(&mutex); тут код, который исполнится когда у нас будет паузаno subject
Date: 2014-01-28 07:39 pm (UTC)no subject
Date: 2014-01-29 03:48 am (UTC)Критическая ошибка в том, что при использовании мьютексов приоритет работающего процесса поднимается до ожидающего, чтобы минимизировать его простой. Поэтому очень легко можно получить много сюрпризов многопоточности от снижения эффективности всей системы до deadlock. Ошибки подобного рода потом крайне трудно отладить.
no subject
Date: 2014-01-29 03:50 am (UTC)alexeyk13 на яндекс.ру
no subject
Date: 2014-01-31 09:42 pm (UTC)В данном случае я гонюсь не за скоростью, мне просто нравится гибкость многопоточного программирования. Тут выигрыш в удобстве реализации.
no subject
Date: 2014-02-01 09:30 am (UTC)Вот хорошая статья про мьютексы: http://www.smxrtos.com/articles/techppr/mutex.htm
Начинать с раздела "Problems with Priority Inheritance".
Резюме такое: мьютексы можно использовать для кратковременной блокировки общих ресурсов. Сами процессы блокировать нельзя - от побочных эффектов развалится вся система, не только два блокирующих процесса.
В твоем случае можно использовать очередь сообщений (если позволяет ОС), либо семафор + мьютекс. Семафор показывает факт наличия события, которое нужно обработать, мьютекс гарантирует, что в момент обращения общий ресурс (команда для выполнения) будет использоваться только одним процессом.
no subject
Date: 2014-02-08 06:39 pm (UTC)