Russian Qt Forum
Ноябрь 27, 2024, 01:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: Нитки и очередь  (Прочитано 27116 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Октябрь 21, 2009, 13:04 »

Код
C++ (Qt)
typedef struct
{
int do_process; // флаг завершения нити
pthread_mutex_t mutexActive; // мутекс активации
// Другие внутренние данные для нитки (если нужно)
} ThreadData;
 
А тогда что делает mutexActive и зачем он нужен? Рабочая нитка все равно ждет на семафоре очереди - все хорошо кроме одного: неясно что должна делать главная нитка после того как она положила в очередь все что хотела. Как отловить момент "очередь пуста и все в ней выполнено"?
« Последнее редактирование: Октябрь 21, 2009, 13:56 от Igors » Записан
BRE
Гость
« Ответ #16 : Октябрь 21, 2009, 13:34 »

А тогда что делает mutexActive и зачем он нужен? Рабочая нитка все равно ждет на семафоре очереди - все хорошо кроме одного: неясно что должна делать главная нитка после того как она положила в очередь все что хотела. Как отловить момент "очередь пуста и все в ней выполнено"?
Если рабочая нитка будет ждать на семафоре очереди, то проснутся она сможет, только при поступлении данных в очередь, а это нам не подходит. Поэтому, я и предложил вариант, что рабочая нитка засыпает на мьютексе, а будить ее извне разблокированием этого мьютекса, когда данные будут появляться или когда наступит момент завершить нить.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Октябрь 21, 2009, 15:03 »

Если рабочая нитка будет ждать на семафоре очереди, то проснутся она сможет, только при поступлении данных в очередь, а это нам не подходит. Поэтому, я и предложил вариант, что рабочая нитка засыпает на мьютексе, а будить ее извне разблокированием этого мьютекса, когда данные будут появляться или когда наступит момент завершить нить.
Ждать на семафоре очереди все нитки обязаны и ничего не изменится если мы "обернем" это в еще 1 мутекс.

Хммм... я кажется придумал как Улыбающийся Сделаю/проверю - отпишусь
Записан
BRE
Гость
« Ответ #18 : Октябрь 21, 2009, 15:09 »

Ждать на семафоре очереди все нитки обязаны и ничего не изменится если мы "обернем" это в еще 1 мутекс.
Кому они обязаны? Почему они обязаны? Кто эти обязательства устанавливает? Улыбающийся

Как вариант, можно ввести "специальное" значение данных, которое будет означать, что нитка которая его получает должна завершиться. Главная нить помещает в очередь рабочие данные и в конце специальные (по количеству запущенных нитей). Рабочие нити обработают нужные данные и когда получат "специальные" завершаться.

Для 3-х нитей:
[data] [data] [data] [data] ... [data] [stop] [stop] [stop]
« Последнее редактирование: Октябрь 21, 2009, 15:33 от BRE » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Октябрь 21, 2009, 15:26 »

Ждать на семафоре очереди все нитки обязаны и ничего не изменится если мы "обернем" это в еще 1 мутекс.
Кому они обязаны? Почему они обязаны? Кто эти обязательства устанавливает? Улыбающийся
Жизнь Улыбающийся Не имею права делать
Код:
job = theJobsQueu.last();
В то время как др. нитка может сделать бяку типа
Код:
theJobQueu.pop_back();
Семафор очереди ставить обязан
« Последнее редактирование: Октябрь 21, 2009, 15:32 от Igors » Записан
BRE
Гость
« Ответ #20 : Октябрь 21, 2009, 15:29 »

Жизнь Улыбающийся Не имею права делать
Код:
job = theJobsQueu.last();
В то время как др. нитка может сделать бяку типа
Код:
theJobQueu.pop_back();
Здесь хватит одного мьютекса, для чего семафор?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Октябрь 21, 2009, 15:40 »

Здесь хватит одного мьютекса, для чего семафор?
Для простоты/удобства изложения давайте считать что семафор и мутекс - одно и то же. Различия между sem_wait и pthread_mutex_lock (sem_post и pthread_mutex_unlock)  нас здесь не интересуют
Записан
BRE
Гость
« Ответ #22 : Октябрь 21, 2009, 15:57 »

Для простоты/удобства изложения давайте считать что семафор и мутекс - одно и то же. Различия между sem_wait и pthread_mutex_lock (sem_post и pthread_mutex_unlock)  нас здесь не интересуют
Лучше давайте на ты.

Главная нить положила данные в очередь и "руками" разблокировала (unlock) очередную нить, которая это значение из очереди достанет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Октябрь 21, 2009, 16:14 »

Лучше давайте на ты.
Не умею, мы с Вами водку не пили Улыбающийся

Главная нить положила данные в очередь и "руками" разблокировала (unlock) очередную нить, которая это значение из очереди достанет.
Да, и все хорошо пока "есть что положить". А вот что делать главной нитке после того как "все положено"? Просто unlock - нельзя, какие-то нитки еще считают. Как узнать что все расчеты закончены?
Записан
BRE
Гость
« Ответ #24 : Октябрь 21, 2009, 16:22 »

Да, и все хорошо пока "есть что положить". А вот что делать главной нитке после того как "все положено"? Просто unlock - нельзя, какие-то нитки еще считают. Как узнать что все расчеты закончены?
Когда у всех нитей флаг calculate == 0, то все расчеты завершены.
Код
C++ (Qt)
typedef struct
{
       int     do_process;                             // флаг завершения нити
       pthread_mutex_t mutexActive;    // мутекс активации
int calculate; // 1 - нить производит вычисления; 0 - нить простаивает
       // Другие внутренние данные для нитки (если нужно)
} ThreadData;
 
void *thread_func( void *data )
{
       assert( data != NULL );
       ThreadData *d = (ThreadData*)data;
 
       for(;;)
       {
               pthread_mutx_lock( d->mutexActive );
 
d->calculate = 1;
 
               ...
 
d->calculate = 0;
       }
       return NULL;
}
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #25 : Октябрь 21, 2009, 19:44 »

Когда у всех нитей флаг calculate == 0, то все расчеты завершены.
На такие грабли я наступал уже не раз Улыбающийся В данном конкретном случае: допустим главная нитка бросилась проверять "все ли отстрелялись". Бог с ним что это некрасиво (главная нитка ест процессор с чем-то типа while(true)) но главное - оно и работать будет "не всегда" а это самое мерзкое. Пример:

- очередь пуста. Две рабочих нитки "дорабатывают". Одна еще не успела установить флаг calculate = 1, другая свой флаг уже сбросила. Именно в этот злосчастный момент главная нитка проверила и решила "все сделано". Alas, poor Yorick  Плачущий
Записан
BRE
Гость
« Ответ #26 : Октябрь 21, 2009, 19:50 »

На такие грабли я наступал уже не раз Улыбающийся В данном конкретном случае: допустим главная нитка бросилась проверять "все ли отстрелялись". Бог с ним что это некрасиво (главная нитка ест процессор с чем-то типа while(true)) но главное - оно и работать будет "не всегда" а это самое мерзкое.
Это цикл по всем ниткам пула. Откуда while( true )?

- очередь пуста. Две рабочих нитки "дорабатывают". Одна еще не успела установить флаг calculate = 1, другая свой флаг уже сбросила. Именно в этот злосчастный момент главная нитка проверила и решила "все сделано". Alas, poor Yorick  Плачущий
Так в мьютекс это оберни, в мьютекс.
Все к чему могут обращаться/устанавливать несколько ниток, нужно в мьютекс оборачивать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #27 : Октябрь 21, 2009, 20:04 »

Это цикл по всем ниткам пула. Откуда while( true )?
"Оттуда". Главная нитка пробежалась и нашла - как минимум 1 из рабочих ниток еще пашет. Что главная нитка должна делать кроме как повторять и повторять проверку? Вот и while( true ) - ну можно do {} while, без разницы

Так в мьютекс это оберни, в мьютекс.
Все к чему могут обращаться/устанавливать несколько ниток, нужно в мьютекс оборачивать.
Да прынцыпы понятны, но не всегда оно легко получается:) Мутексом-то управлять надо а не просто "оборачивать"
Записан
BRE
Гость
« Ответ #28 : Октябрь 21, 2009, 20:16 »

"Оттуда". Главная нитка пробежалась и нашла - как минимум 1 из рабочих ниток еще пашет. Что главная нитка должна делать кроме как повторять и повторять проверку? Вот и while( true ) - ну можно do {} while, без разницы
Есть такая штука, называется семафор. Вот если его инициализировать количеством рабочих нитей и при начале расчета нитка будет его уменьшать на единицу, а при завершении увеличивать, то у тебя будет точное количество рабочих нитей без всяких циклов.

Да прынцыпы понятны, но не всегда оно легко получается:) Мутексом-то управлять надо а не просто "оборачивать"
Ну конечно, то не легко, это не просто.
У меня складывается впечатление, что ты даже не подумал о чем я говорю, а сразу кинулся в спор. И вместо того что бы искать решение придумываешь себе сложности.
Ты думаешь мне интересно с тобой спорить?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #29 : Октябрь 21, 2009, 20:34 »

Есть такая штука, называется семафор. Вот если его инициализировать количеством рабочих нитей и при начале расчета нитка будет его уменьшать на единицу, а при завершении увеличивать, то у тебя будет точное количество рабочих нитей без всяких циклов.
Будет, а толку? Если значение ноль - что это значит? Все нитки работают или все уже кончилось?

Ну конечно, то не легко, это не просто.
У меня складывается впечатление, что ты даже не подумал о чем я говорю, а сразу кинулся в спор. И вместо того что бы искать решение придумываешь себе сложности.
Ты думаешь мне интересно с тобой спорить?
Да никуда я не кидался Улыбающийся Понятно что все операции с нитками должны быть тщательно синхронизированы - но как это сделать в данном случае? Что в кого обернуть? Ну помещу я это "внутрь" еще одного мутекса - и что? А решение я кажется придумал. Сделаю/проверю - отпишусь. И злиться на меня нечего Улыбающийся
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.309 секунд. Запросов: 23.