Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
привет всем. я тут приболел.. решил сделать вот такую штуку: создаешь объект класса, у него есть функция add - добавляешь задание (std::function<void()>) и это задание исполняется в другом потоке. ну смысл в том, что тебе может быть нужно выполнить несколько тысяч таких заданий и создавать поток для каждого - не нужно, а вот поставить их ждать в одном потоке - вполне можно. так вот, что-то пошло не так (видимо температура дает свое :) ) вот весь незамысловатый код Код: 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. а вот тест Код: 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. 33. вобщем под отладкой это дело не работает вобще - sigabrt . не под отладно - оно падает иногда, если сделать detach (что понятно, потому что поток может продложить работать на унчтоженным объекте), и тупо подвисает если сделать join (но не всегда). тест вроде проходится (ну то есть чеки выполняются). что тут не так? и может знает кто готовую реализацию, чтобы свой велосипед не изобретать? а то я уже заколебался (чего-то гугл мне ничего не сказал). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 16:45 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
Не помешает перепроверить останов, т.к. stop_ может поменяться между while(!stop_) и lock() Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 16:56 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
Dima T, спасибо.. а если я вызываю wait, а условие уже true - то он все равно будет ждать по кто-нибудь не вызовет notify_all ? я добавил эту строку, но зависон оставлся.. то есть у меня была такая идея: в деструкторе я жду пока очередь опустошится (tasks_mutex_ блокирую), потом жду пока поток завершится, обобработав все задания, но на следующий круг он уже не пойдет, так как стопер... но даже если убрать метекс в деструкторе проблема остается - то есть зависает поток, работающий с очередью, а гланвый поток висит в его ожидании.. но вот интересен вывод (добавил сразу после wait запись в std::cout) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. то есть в последнем случаи этот поток подвис даже не зайдя в кондишн вариабл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 17:10 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
ой, что это у меня сообщением? его чего-то раздуло, теперь горизонтальный скрол появился.. не хотел, сори. зы: модератора, можете поправить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 17:13 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
alexy_blackспасибо.. а если я вызываю wait, а условие уже true - то он все равно будет ждать по кто-нибудь не вызовет notify_all ? я добавил эту строку, но зависон оставлся.. notify_all() будит только тех кто стоит на wait(), т.е. если один поток вызвал notify_all(), а после второй встал на wait() то остановится. Данная ситуация крайне редка, но теоретически возможна. Вот еще косяк, ты мутекс не освободил, наверно из-за этого виснет Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 17:20 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
И эта строчка лишняя Код: plaintext 1. 2. 3. 4. 5. 6. 7. Насколько я понимаю notify_one() надо вызывать при захваченном мутексе. В примерах так . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 17:27 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
Dima T, о, стал гораздо реже зависать. если раньше я мог в консоле нажимать наверх и enter то теперь пришлось написать while... но все равно подвис. я там вставил std::cout << __FILE__ << ":" << __LINE__ << std::endl; это чтобы узнать где, у обранужил, что на первом блокировании мутекса. то есть Код: plaintext 1. 2. 3. 4. 5. 6. 7. еще решил добавить такую проверку Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 17:31 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
о, вроде заработало! Dima T спасибо еще одна ошибка - нельзя похоже так поток инициализировать. то есть его надо было либо последним писать в заголовнике либо инициализировать уже внутри конструктора. может быть поэтому подвисал - поток начинал выполняться до того, как был инициализирован объект.. сейчс сделал в самом конструкторе swap - и все заработало :) зы: ну, я сейчас уже пару минут тест гоню, вроде нет зависонов. но до полного "заработало" наверное еще далеко :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 17:40 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
У тебя еще архитектурный косяк в коде потока: ты список задач забрал, пока выполнял - новые накопились, а ты уснул на ожидании очередной новой. Добавь проверку что список пуст перед тем как уснуть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 17:53 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
Dima TУ тебя еще архитектурный косяк в коде потока: ты список задач забрал, пока выполнял - новые накопились, а ты уснул на ожидании очередной новой. Добавь проверку что список пуст перед тем как уснуть. ага, я его заметил 18996966 сейчас пытаюсь сделать конструктор перемещения и опрератор присваивания-перемещение.. оказалось мутекс не может переместиться.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 18:29 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
такс, вроде сделал.. вот конечная версия, вдруг кому понадобится :) запустил тест, потом открыл вкладку в браузере, пишу сообщение, но вроде пока не провалился header Код: 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. sources Код: 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. test Код: 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. тест запускал вот так (у меня fish оболочка) Код: fish ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 19:02 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
Недавно делал подобное. В итоге родил аналог виндового Event , на этом и остановился. Книжку про С++14 прочитал, продолжить пока руки не доходят. Задача подобная: быстро вставлять в очередь на обработку в рабочем потоке, затем там не спеша разгребать в другом. Остановился на "быстро вставлять в очередь", твоя идея со swap() списка интересная (спишу у тебя), но есть сомнения использовать list или vector. ИМХУ vector побыстрее будет, пока перевыделение памяти не потребуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 19:58 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
Dima T, да, кстати, наверное действительно vector.. просто я сначала хотел сделать push_back и pop_front, но потом подумал о swap, а list остался.. но даже не знаю.. просто у меня может получится так, что резко появится огромная куча заданий для очереди, потом их может не быть долгое время. по сравнению со скоростью вставки в лист, решение поставленной в очередь задачи - очень долго, поэтому не думаю что это важно в моем случаи.. можно сделать шаблон - где храить параметр шаблона :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 20:24 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
alexy_blackпо сравнению со скоростью вставки в лист, решение поставленной в очередь задачи - очень долго В моем случае это несравниваемые величины. У меня рабочий поток должен максимально быстро вставлять задания в очередь, а с какой скоростью они обрабатываются - неважно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 20:32 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
А тупо реализовать паттерн producer-consumer не судьба?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 20:42 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА тупо реализовать паттерн producer-consumer не судьба?.. Тут разве не он реализован? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 20:46 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
Dima TТут разве не он реализован? Не похоже. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 21:20 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
блин.. все равно похоже придется реализовывать это в виде шаблона.. внезапно, если туда передать лямбду с переменной, которая может быть только перемещена (то есть в захвате лямбды переместить переменную), то этот код не будет компилится :( патерн продюсер-консюмер расчитан на то, что один поток данные производит, а другой обрабатывает.. тут я хотел чтобы функции запускались в потоке. отличе в том, что этот класс не содержит логики работы и может обрабатывать данные как ему нужно, а если бы это был ресивер - то он бы должен был знать как обрабатывать данные... если я праильно понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 21:47 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
alexy_blackесли я праильно понимаю. Неправильно понимаешь. Паттерну совершенно всё равно какие данные скармливаются консумеру и что тот с ними делает. Он всего лишь описывает модель взаимодействия потоков и организацию очереди. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 22:19 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
гы, таки работать с температурой, не айс )))) https://habrahabr.ru/post/188234/ thread pull надо было искать ))) но мне мой код больше нравится. я расчитывал на то, чтобы я мог быстро добавить туда задание и занятся чем-нибудь другим. а в реализации на хабре при добавлении следующего задания ты будешь ждать... я туда хочу boost::fiber::promise скормить, чтобы он нужню фибру стартовал когда закончит, но не получилось.. так что сейчас переписываю как шаблон. Dimitry Sibiryakovalexy_blackесли я праильно понимаю. Неправильно понимаешь. Паттерну совершенно всё равно какие данные скармливаются консумеру и что тот с ними делает. Он всего лишь описывает модель взаимодействия потоков и организацию очереди. так в том-то и дело, что данные, а не задачи. а если задачи - то получается это и есть реализация указанного патерна. а чтобы реализовать thread_pull нужно я так понимаю несколько таких объектов, и добавлять задание в тот, в котором их меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 22:34 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
alexy_blackтак в том-то и дело, что данные, а не задачи. Указатель на процедуру - тоже данные. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 22:43 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
alexy_blackthread_pull глаз режет pool ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 22:46 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
Изопропилalexy_blackthread_pull глаз режет poolэто такой стягиватель потоков :) тянет потоки с соседского компа :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 22:58 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
alexy_blackнужно я так понимаю несколько таких объектов, и добавлять задание в тот, в котором их меньше. Не самая лучшая реализация. Во-первых каждый раз искать менее загруженный. Во-вторых может поток загружен одним заданием, но оно долгое и последующие 10 успеет выполнить другой поток. ИМХУ если тебе надо более сложное управление обработкой, то посмотри на готовые либы. Например ZeroMQ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2016, 07:03 |
|
||
|
очередь задания для потока
|
|||
|---|---|---|---|
|
#18+
Dima Talexy_blackнужно я так понимаю несколько таких объектов, и добавлять задание в тот, в котором их меньше. Не самая лучшая реализация. Во-первых каждый раз искать менее загруженный. Во-вторых может поток загружен одним заданием, но оно долгое и последующие 10 успеет выполнить другой поток. ИМХУ если тебе надо более сложное управление обработкой, то посмотри на готовые либы. Например ZeroMQ это я просто предположил как бэ.. но мне кажется на счет thread pool - ты никак не сможешь узнать какая функция будет дольше выполняться.. там надо наверное делать как я хотел изначально - std::list и первый поток, который освободился, берет первый элемент от туда, а вставляешь элементы в конец. но у меня такой цели не было, нужен был просто один поток. вот добавил тут функции Код: 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. эта штука стартует в потоке функцию, а когда она сгенерирует значение, стратует фибру, которая ожидает нужного future. минус - исключение в runtime если забыл что этот copyable объект насамом деле никакой ни copyable. но поскольку это спрятано внутри реализации, то не должно такого произойти. оригинальная boost::fibers::async эту функцию запускает не в потоке, а в другой фибре. что меня не устраивает, поскольку основной поток должен работать над другими задачами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2016, 11:27 |
|
||
|
|

start [/forum/topic.php?fid=57&tid=2018564]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 156ms |

| 0 / 0 |
