Я реализую алгоритм передачи сообщений.Сообщения распространяются через узлы графа, блокируясь, пока они не получили достаточно информации (от других соседей) для отправки сообщения.
Алгоритм легко написать, если я помещу каждое сообщение в свой собственный поток ииспользуйте boost :: condition, чтобы приостановить поток, пока не будет доступна вся необходимая информация.Я создаю много тысяч тем, но в большинстве случаев активны только немногие.Кажется, это работает очень хорошо.
Моя проблема в том, что при модульном тестировании я обнаруживаю, что если я создаю более 32705 потоков, я получаю
неизвестное местоположение (0): фатальноошибка в "Tree_test": std :: exception: boost :: thread_resource_error
, и я не знаю, что вызывает это или как это исправить.
Кажется, что имеется достаточное количество доступной памяти (каждый поток содержит только два указателя - объекты, между которыми проходит сообщение).
Из этого вопроса: Максимальное количество потоков на процесс в Linux? Я думаю, что следующая информация является подходящей (хотя я действительно не знаю, что это значит ...)
~> cat /proc/sys/kernel/threads-max
1000000
(я увеличил это с 60120 - нужно ли перезапускать?)
~>ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Я попытался поиграть с ожидающими сигналами (мой предел очень близок к 2 * этому числу) и размером стека с ulimit -S -i 8191
- (я не смог увеличить его), но эти изменения, похоже, не далиэффект вообще)
Я на 64-битной Ubuntu-10-10, если этот помогает ...