|
|
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Есть что то подобное? У меня есть объект, который позволяет потокозащищенно записывать в очередь буфер данных, который потом забирает обрабатывающий поток. В общем виде выглядит так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. И крутится должно это все в разных потоках подтипа (инстанс опущен для краткости) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Зависая на методе FQueue->WaitForBuffer() до тех пор, пока не появится знак что в очереди появился новый объект и его можно обработать. В Windows я бы воспользовался WaitForSingleObject + Event, а вот в кросс что-то погуглил - ничего путевого не нашел, а колхозными слипами как то очень не хочется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 21:06 |
|
||
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
В линуксе нет event, но есть condition variable, но это немного другое. Оно теперь есть в виндовсе. Я пытался прийти к общему знаменателю, итого тут 18712566 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 21:16 |
|
||
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Dima T, >> тем более что для condition_variable изначально в документации заявлена возможность ложного срабатывания Что-то как-то хз =D тогда уж слипами надежнее. Но должно же быть какое то базовое решение, неужели все на слипах живут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 21:28 |
|
||
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
CiplusorЧто-то как-то хз =D тогда уж слипами надежнее. А в чём проблема-то с ложным срабатыванием? Для очереди оно сугубо пофиг: всё равно ты в цикле проверяешь голову очереди и если она пустая - ждёшь сигнала. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 21:40 |
|
||
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovCiplusorЧто-то как-то хз =D тогда уж слипами надежнее. А в чём проблема-то с ложным срабатыванием? Для очереди оно сугубо пофиг: всё равно ты в цикле проверяешь голову очереди и если она пустая - ждёшь сигнала. Тогда заводить дополнительную переменную которая будет отвечать за учет прерывания цикла ожидания. Но вообще мне страшно пользоваться тем, что внезапно может работать со сбоями. Особенно если на далеком сервере все посыпется с хрен пойми каким стеком 8( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 21:44 |
|
||
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Вот так выглядит pop у моей очереди: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 21:45 |
|
||
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
За condition variable спасибо, на хабре нашел разъясняющую статью, попробую прикрутить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 21:49 |
|
||
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
CiplusorТогда заводить дополнительную переменную которая будет отвечать за учет прерывания цикла ожидания. У тебя уже есть такая переменная: это голова очереди. Цикл автоматически прерывается если из очереди есть что выбрать. CiplusorНо вообще мне страшно пользоваться тем, что внезапно может работать со сбоями. false positive это гораздо лучше, чем false negative. Проблема была бы если вы ожидание иногда не прерывалось при взведении флага. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 21:49 |
|
||
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovУ тебя уже есть такая переменная: это голова очереди. Цикл автоматически прерывается если из очереди есть что выбрать.Не, я имел ввиду переменную - аналог вашего (wait(timeout)); которая прервет цикл, если поток его выполняющий нужно будет остановить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 21:53 |
|
||
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
CiplusorНе, я имел ввиду переменную - аналог вашего (wait(timeout)); которая прервет цикл, если поток его выполняющий нужно будет остановить А, так тебе не только очередь надо ждать? Тогда это уже WaitForMultipleObjects и тут с кроссплатформенностью совсем туго. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2018, 22:13 |
|
||
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovПроблема была бы если вы ожидание иногда не прерывалось при взведении флага. Как понимаю такая проблема тоже есть. Например поток обработки закончил обрабатывать очередь, почти дошел до засыпания на cv.wait(), в этот момент другой поток вызывает cv.notify_one() и этот вызов игнорируется, т.к. первый не успел заснуть на cv.wait(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2018, 08:27 |
|
||
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Dima TDimitry SibiryakovПроблема была бы если вы ожидание иногда не прерывалось при взведении флага. Как понимаю такая проблема тоже есть. Например поток обработки закончил обрабатывать очередь, почти дошел до засыпания на cv.wait(), в этот момент другой поток вызывает cv.notify_one() и этот вызов игнорируется, т.к. первый не успел заснуть на cv.wait(). Dima T, такой проблемы нет. Как минимум в g++ Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. Лишнее срабатыванее ждущего рабочего потока может случится при вызове notify_all() и очередь короче количества рабочих потоков, или вообще пуста. Это стандартная ситуация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2018, 09:05 |
|
||
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Допустим оба потока выполнялись одним ядром проца и контекст переключился сразу после опустошения очереди. Схематично так Поток 1Поток 2for(;;) { while(!queue.empty()) { ... обработка очереди } queue.push(...); cv.notify_one(); cv.wait();} Как я понимаю тут wait() уйдет в ожидание, хотя очередь уже не пуста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2018, 09:40 |
|
||
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Dima TДопустим оба потока выполнялись одним ядром проца и контекст переключился сразу после опустошения очереди. Схематично так Поток 1Поток 2for(;;) { while(!queue.empty()) { ... обработка очереди } queue.push(...); cv.notify_one(); cv.wait();} Как я понимаю тут wait() уйдет в ожидание, хотя очередь уже не пуста. К собственно condition_variable это не относится. Это проблема конкретного кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2018, 09:57 |
|
||
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
OoCcК собственно condition_variable это не относится. Это проблема конкретного кода. Код типовой. Для виндового EVENT данной проблемы нет. Хотя тут тоже можно эту ситуацию исключить дополнительной проверкой после блокировки мутекса Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2018, 10:12 |
|
||
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Dima TOoCcК собственно condition_variable это не относится. Это проблема конкретного кода. Код типовой. Для виндового EVENT данной проблемы нет. Хотя тут тоже можно эту ситуацию исключить дополнительной проверкой после блокировки мутекса Код: plaintext 1. 2. типовой код - делается класс очередь multiple producers / multiple consumers. А уж на основе чего она сделана не имеет значения. И с condition_variable нам нет никаких проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2018, 10:20 |
|
||
|
Кроссплатформенный WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Dima TКак я понимаю тут wait() уйдет в ожидание, хотя очередь уже не пуста. Потому что не так они должны использоваться. Они всегда работают в паре с мутексом. Семафоры могут быть удобнее для организации очереди, но они не входят в стандарт С++. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2018, 11:13 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39692303&tid=2017775]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
| others: | 205ms |
| total: | 494ms |

| 0 / 0 |
