Современные процессоры содержат все больше и больше ядер. И для того, чтобы эффективно использовать имеющиеся ресурсы, необходимо разрабатывать параллельные (многопоточные) программы, которые за счет использования нескольких ядер, будут выполняться быстрее. В принципе, как сделать параллельное выполнение более-менее понятно. Единственная сложность это использование сборщика мусора. Если при однопоточном режиме, во время работы сборщика мусора вся остальная программа не выполняется, то при многопоточном режиме этого нет.
Какие есть варианты:
1) Приостановить все потоки и собирать мусор. Но даже здесь, может возникнуть сложность. Так как, если при однопоточном режиме, сборщик мусора, обычно запускается при вызове функции NEW или же вызывается какая функция, когда система проставивает, то есть сборка мусора происходит в строго определенных местах программы. То при остановке потоков, они могут остановиться где попало и может так быть, что какие-то значения скопированы в регистры, например. И значения в регистрах тоже надо будет анализировать на предмет того, а не является ли он указателем. И, если при анализе стека, можно реализовать какие-то дескрипторы, которые будут говорить, где именно хранятся указатели, а где просто числовые переменные. И таким образом, можно реализовать, точный сборщик мусора, то с регистрами так не получится, и получится только реализовать консервативный сборщик мусора.
2) Или же надо реализовывать какой-то параллельный сборщик мусора, например, такой, который описан у Дейкстры. Но насколько я понимаю, он тоже приостанавливает все потоки, чтобы собрать только корневые указатели, а дальше уже потоки можно отпустить.
3) Может быть есть еще какие-то варианты.

По идее хотелось бы иметь очень простое, но надежное решение.
Кто-нибудь уже думал над проблемой сборки мусора для многопоточных приложений?