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

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

Страниц: 1 ... 6 7 [8]   Вниз
  Печать  
Автор Тема: Использование QWaitCondition  (Прочитано 74733 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #105 : Июль 18, 2013, 08:53 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #106 : Июль 18, 2013, 11:17 »

Ну вот я просто переставил 2 строчки
Код
C++ (Qt)
for (int i = 0; i < dataSize; i++)
{
mutex.lock(); // Блокирем мютекс
while (listTask.size() == bufSize) // Если буфер полный
bufNotFull.wait(&mutex); // Ждем побудки буфер не полный
 
listTask.push_back(i); // Генерируем задачу
 
// bufNotEmpty.wakeAll(); // Побудка что буфер не пустой
mutex.unlock(); // Разблокируем мютекс
bufNotEmpty.wakeAll(); // <----
}
Не вижу чем мне это грозит. Каким образом заклинит?
Записан
Kosmonit
Гость
« Ответ #107 : Июль 19, 2013, 12:40 »

Ну вот я просто переставил 2 строчки
Код
C++ (Qt)
for (int i = 0; i < dataSize; i++)
{
mutex.lock(); // Блокирем мютекс
while (listTask.size() == bufSize) // Если буфер полный
bufNotFull.wait(&mutex); // Ждем побудки буфер не полный
 
listTask.push_back(i); // Генерируем задачу
 
// bufNotEmpty.wakeAll(); // Побудка что буфер не пустой
mutex.unlock(); // Разблокируем мютекс
bufNotEmpty.wakeAll(); // <----
}
Не вижу чем мне это грозит. Каким образом заклинит?
Я думаю, что ничего не будет, но для перестраховки, я бы поместил разблокировку мьютекса после побудки...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #108 : Июль 19, 2013, 12:51 »

Я думаю, что ничего не будет, но для перестраховки, я бы поместил разблокировку мьютекса после побудки...
Я тоже, в конце концов когда-то надо "просто запомнить". Но привести пример когда рухнет если wait не под мутексом - я не могу. Примерчик сделал - работает, но это ничего не доказывает
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #109 : Июль 19, 2013, 12:55 »

Я думаю, что ничего не будет, но для перестраховки, я бы поместил разблокировку мьютекса после побудки...
Зависит от реализации.
Вот для pthread четко прописано, будить при захваченом мьютексе. Возможно, где то будет подругому, хотя я сильно сомневаюсь.
Сейчас мы по сути пытаемся использовать разделяемый ресурс (условную переменную) без защиты мьютексом. Что может произойти, если две нитки полезут в wake, зависит от реализации этого самого wake.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #110 : Июль 19, 2013, 13:06 »

Вот для pthread четко прописано, будить при захваченом мьютексе.
Не вижу этой четкости, напр
http://stackoverflow.com/questions/4544234/calling-pthread-cond-signal-without-locking-mutex
Доказательство там очень неубедительное
« Последнее редактирование: Июль 19, 2013, 13:14 от Igors » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #111 : Июль 19, 2013, 13:13 »

Аааааа. Вы бы еще ссылку на Хабр выложили. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #112 : Июль 19, 2013, 13:18 »

Аааааа. Вы бы еще ссылку на Хабр выложили. Улыбающийся
По-моему stackoverflow - очень толковый сайт. Ну и никто не мешает Вам привести действительно авторитетный (по Вашему мнению) первоисточник, а еще лучше - сценарий краша "по ходам".
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #113 : Июль 19, 2013, 14:46 »

По-моему stackoverflow - очень толковый сайт.
Почему вы тогда не верите написанному там? Улыбающийся

Ну и никто не мешает Вам привести действительно авторитетный (по Вашему мнению) первоисточник.
man pthread_cond_signal

а еще лучше - сценарий краша "по ходам".
А еще лучше!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #114 : Июль 19, 2013, 15:22 »

Почему вы тогда не верите написанному там? Улыбающийся
Так а что ж там написано
Цитировать
Process B (incorrect):

condition = TRUE;
pthread_cond_signal(&cond);
То ясно что если я переменную condition меняю не под мутексом - отгребу. Но вот почему  pthread_cond_signal должен быть внутри - хз

Ну и чего ото делать вид что это якобы очевидно? Улыбающийся Не надо бояться сказать "не знаю", это часто проще и лучше
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #115 : Июль 19, 2013, 15:26 »

Ну и чего ото делать вид что это якобы очевидно? Улыбающийся
Для меня да. Вызов pthread_cond_signal(&cond); это доступ к разделяемому ресурсу без защиты мьютексом. Может быть все что угодно в зависимости от реализации.

Не надо бояться сказать "не знаю", это часто проще и лучше
Проще учиться думать и разбираться самому, а не спрашивать по форумам.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #116 : Июль 19, 2013, 16:03 »

Проще учиться думать и разбираться самому, а не спрашивать по форумам.
А я и не просил Вас ни о какой помощи Улыбающийся Просто интересно "почему". Хорошо, вот еще попытка доказательства
Цитировать
This is valid:

void *threadproc(void *data) {
    printf("Sending go signal\n");
    go = 1;
    pthread_cond_signal(&cond);
}

However, consider what's happening in main

while(!go) {
    /* Suppose a long delay happens here, during which the signal is sent */
    pthread_cond_wait(&cond, &lock);
}

If the delay described by that comment happens, pthread_cond_wait will be left waiting—possibly forever. This is why you want to signal with the mutex locked
Обратите внимание что вызов pthread_cond_signal не требует защиты (то же и в др источниках). Да, побудка будет упущена, в этом автор прав. Но как мы знаем, само по себе это не криминал. Если до того мы взвели go (под защитой) - то должно работать, задача не пропускается
Код
C++ (Qt)
pthread_mutex_lock(&lock);
go = 1;
pthread_mutex_unlock(&lock);
pthread_cond_signal(&cond);
 
Или я ошибаюсь?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #117 : Июль 19, 2013, 16:13 »

Или я ошибаюсь?
Если несколько ниток будут писать и читать int без защиты мьютексом, будет работать?
Вроде будет, а потом... а на другой платформе... а на другой архитектуре...

Поэтому, мне совершенно не понятно, что доказывает (или не доказывает) этот пример.
Еще раз, я думаю, что разработчики pthread настаивают на вызове signal под защитой мьютекса, потому что в реализации самих функций работы с условной переменной (pthread_cond_xxx) могут быть "тонкие места", а не в пользовательском коде.
« Последнее редактирование: Июль 19, 2013, 16:30 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #118 : Июль 19, 2013, 16:40 »

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

Вроде будет, а потом... а на другой платформе... а на другой архитектуре...
Да конечно практичнее впихнуть под мутекс чем разбираться - я ж с этим не спорю. Но какой-то Вы совсем не любознательный, хотя еще молодой  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #119 : Июль 19, 2013, 16:46 »

Но какой-то Вы совсем не любознательный, хотя еще молодой  Улыбающийся
А в чем здесь любознательность? Сейчас условные переменные реализовали так, завтра их реализуют по другому, под какой нибудь вендой по третьему? Мне нужно все изучить? Любознательный вы наш? Улыбающийся

хотя еще молодой  Улыбающийся
Нуу 40 лет это не возраст для мужчины.  Смеющийся
« Последнее редактирование: Июль 19, 2013, 16:53 от Old » Записан
Страниц: 1 ... 6 7 [8]   Вверх
  Печать  
 
Перейти в:  


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