Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
Надо пробуждать поток по мере необходимиости. С event все просто: ожидающий висит на WaitForSingleObject(), тот кому он потребовался вызывает SetEvent(), пример: Код: 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. В линуксе подобное можно сделать семафорами. Как сделать подобное средствами С++ ? <mutex> не подходит, т.к. unlock() может выполнить только тот поток который вызывал lock(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 07:50 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
Dima T, там же есть condition variables ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 08:00 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
MasterZivтам же есть condition variables Я читал про них, но так и не понял как их в такую конструкцию вписать. Еще почитаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 08:13 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
Немного разобрался с condition_variable Непонятно зачем перед командой на пробуждение (notify_one()) надо unique_lock. Во всех примерах так . Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 09:44 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
Dima T, потому что notify_ разблокирует его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 10:14 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
lockedDima T, потому что notify_ разблокирует его. Если строчку unique_lock убрать - работает точно также. Думаю она нужна чтобы одновременно два notify_ не вызвать с двух разных потоков. Но не уверен что правильно понимаю. Где бы поподробнее почитать как <condition_variable> устроены, желательно по-русски. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 10:31 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
Dima TlockedDima T, потому что notify_ разблокирует его. Если строчку unique_lock убрать - работает точно также. Думаю она нужна чтобы одновременно два notify_ не вызвать с двух разных потоков. Но не уверен что правильно понимаю. Где бы поподробнее почитать как <condition_variable> устроены, желательно по-русски. немного подзабыл. захват мютекса перед вызовом notify нужен только для монопольного доступа к ресурсам. например добавление задания в очередь для запускаемой thread. мютекс нужно освободить. т.к. пробуждаемая thread его захватывает внутри wait. по выходу из wait мютекс захвачен. thread может взять задание из очереди и _должна_ освободить мютекс. типа такого Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 11:10 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
lockedнемного подзабыл. захват мютекса перед вызовом notify нужен только для монопольного доступа к ресурсам. например добавление задания в очередь для запускаемой thread. мютекс нужно освободить. т.к. пробуждаемая thread его захватывает внутри wait. по выходу из wait мютекс захвачен. thread может взять задание из очереди и _должна_ освободить мютекс. ... Спасибо. Теперь понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 12:19 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
Dima T, ну кстати я тоже не понимаю, почему бы аналог виндовых event не сделать в xnix. мне они кажутся более понятными , чем cond var. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 12:57 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
MasterZivну кстати я тоже не понимаю, почему бы аналог виндовых event не сделать в xnix. Семафоры почти аналог. http://pubs.opengroup.org/onlinepubs/009695399/basedefs/semaphore.h.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 13:47 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
MasterZivну кстати я тоже не понимаю, почему бы аналог виндовых event не сделать в xnix. мне они кажутся более понятными , чем cond var. Самое смешное, что виндовый event это внутри и есть мьютекс + условная переменная )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 14:26 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyСамое смешное, что виндовый event это внутри и есть мьютекс + условная переменная )) Тогда почему event быстрее? Код: plaintext 1. 2. 3. Код теста Код: 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. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. Интересные результаты. Похоже <mutex> не использует виндовый mutex. Ну и CRITICAL_SECTION самый быстрый способ. Интересно стало. Вечером линуксовый mutex потестю, нет под рукой многоядерного линукса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 15:14 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
Dima TТогда почему event быстрее? Потому что код внутри разный? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 15:25 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
Dima T, я глубоко не погружался в тему крит-секций. Но в погоне за скоростью ты не забыл что есть еще и критерий "справедливости" выдачи маркера для ожидающих потоков? Ну ... по крайней мере тема справедливости поднималась в альтернативных (отличных от С++) систем разработки и ЯП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 15:33 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
maytonDima T, я глубоко не погружался в тему крит-секций. Но в погоне за скоростью ты не забыл что есть еще и критерий "справедливости" выдачи маркера для ожидающих потоков? Сходу не смог придумать задачу где важно равномерное распределение пробуждения. Если все-таки важно, организуй идеальное распределение внутри CS счетчиком. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Код: plaintext 1. 2. 3. CS быстро работает пока одновременно несколько потоков не начинают ждать входа, в этом случае он event задействует и начинает подтормаживать. Вот тест на 3 потоках Код: plaintext 1. Т.е. CS есть смысл использовать там где конкуренция маловероятна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 16:18 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
Dima TИнтересно стало. Вечером линуксовый mutex потестю, нет под рукой многоядерного линукса. не забудь про pthread_spin_lock . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 16:44 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
Со счетчиком для идеального распределения я фигню придумал, тормозит из-за холостых циклов. Замерил распределение дополнительным счетчиком в потоке Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. local 334744 count local 330466 count local 334792 count Mutex 1700 msec 1000002 count local 335488 count local 335494 count local 329020 count Event 1684 msec 1000002 count local 333330 count local 333322 count local 333350 count STD::Mutex 312 msec 1000002 count local 316675 count local 336532 count local 346794 count CS 125 msec 1000001 count У CS похуже, но не намного. Отчасти из-за этого и скорость выше. Для идеального распределения надо чаще потоки переключать, что тоже доп. затраты времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 16:48 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
Затестил в линуксе Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Код: 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. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. Код: plaintext 1. 2. 3. Полные результаты под спойлером, там видно что на равномерное распределение линукс не заморачивается. PS Время не сравнивайте с тестами выше, комп другой, послабже. Затестю потом этот код на том же компе что и в виндовсе. Но и так понятно что линукс быстрее переключается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 19:22 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
Хм... интересно девки пляшут. https://ru.wikipedia.org/wiki/Spinlock Кроме того, в той же Windows есть разновидности мьютексов (например, общеизвестная CRITICAL_SECTION, или же FAST_MUTEX в ядре), которые сначала работают как spinlock, используя опрос значения в памяти, и только потом, по истечении большого количества опросов, переходят в ядро к блокирующему ожиданию. Такие объекты сочетают лучшие качества спинлоков (минимальная цена захвата) и мьютексов (отсутствие растраты ресурса процессора на опрос). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 20:50 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
Интереснее это https://ru.wikipedia.org/wiki/Spinlock Дело в том, что реализация атомарных операций с памятью происходит путем аппаратного блокирования системной шины процессором на время выполнения атомарной операции (которая включает чтение, модификацию и запись). Во время выполнения этих трёх операций выполнение каких-либо других операций на шине невозможно, что снижает производительность других процессоров в системе (если они разделяют общую шину), даже если они не имеют никакого отношения к данному спинлоку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 21:24 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
Затестил в линуксе на том же компе где в виндовсе тестил Код: 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. Код: plaintext 1. 2. 3. 4. Вот как было в виндовсе в три потока: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2015, 16:57 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
Dima T Затестил в линуксе на том же компе где в виндовсе тестил Код: 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. Код: plaintext 1. 2. 3. 4. Интересные результаты. спинлок и мютэкс почти одинаковы. Какая версия ядра ? CPU ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2015, 08:37 |
|
||
|
Аналог windows event в с++
|
|||
|---|---|---|---|
|
#18+
lockedКакая версия ядра ? CPU ? Запускал с флэшки Debian 7.5 live c nonfree драйверами. Версию ядра не смотрел. Проц i5-660 реально 2 ядра, для ОС - 4 (Hyper-threading не отключается) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2015, 09:24 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38939471&tid=2019023]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
67ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 284ms |
| total: | 436ms |

| 0 / 0 |
