возможен только 1 поток с boost asio на машинах с большим количеством ядер - PullRequest
0 голосов
/ 21 июня 2019

У нас очень странная проблема, нам удается создать очень маленький, воспроизводимый (на некоторых ПК) пример: main.cpp Dockerfile Этот код абсолютно бесполезен, он только регистрирует малострок, но эти несколько строк доказывают, что он не работает с более чем 1 потоком.

Мы используем boost 1.70 (Asio 1.14.0)

Я тестировал на 3 компьютерахдо сих пор:

мой рабочий стол Ryzen 1950X 64 ГБ ОЗУ в основном заканчивается:

started for 1 threads
Listener started on thread: 140593064609536
started for 2 threads
started for 3 threads
started for 4 threads
started for 5 threads
started for 6 threads
started for 7 threads

(иногда 2 или 3 тоже работает, но в основном нет) Я тестировал на этой машине также сборкус msvc на Windows, и результат был в том, что он работает нормально, поэтому проблема как-то связана с linux + подсчетом ядра.

главный сервер 2x E5-2630 v3 128 ГБ ОЗУ в основном заканчиваются:

root@cf8c892390ce:/app/test/bin# ./test
started for 1 threads
Listener started on thread: 140062574507776
started for 2 threads
started for 3 threads
started for 4 threads
started for 5 threads
started for 6 threads
started for 7 threads

(однажды из более чем 100 тестов 2 также работали, но никогда больше)

старый тестовый сервер 2x старый процессор Intel 2 core 4 ГБ ОЗУ большинство результатов выглядит следующим образом:

root@f06821a4cbc8:/app/test/bin# ./test
started for 1 threads
Listener started on thread: 140650646316800
started for 2 threads
Listener started on thread: 140650621138688
started for 3 threads
Listener started on thread: 140650246829824
started for 4 threads
Listener started on thread: 140650213259008
started for 5 threads
Listener started on thread: 140649944823552
started for 6 threads
Listener started on thread: 140649743496960
started for 7 threads
Listener started on thread: 140649726711552

(иногда 5, 6 или 7 потоков не работают)

Мы тестировали на нескольких других системах и только1 поток работает надежно.

Можете ли вы взглянуть на код и сказать мне, есть ли там какая-то глупая ошибка? Или это ошибка в asio?

И самое главное, мы можем исправитьэто как-то?

1 Ответ

2 голосов
/ 21 июня 2019

Вы, вероятно, запускаете циклы событий (run () и связанные с ними) до публикации фактической работы.

Это позволит завершить службы до запуска слушателя (состояние гонки), что объясняетсимптомы.

Обычный способ избежать этого - использовать объект work<>.

Теперь посмотрите на ваш код.

...