Ответ 1
Проведя некоторое тестирование и чтение документации, я пришел к следующим выводам. В отчете говорится, что все это определяется реализацией, поэтому нет стандартного способа. Модуль Control.Concurrent
указывает в своей документации, что main является связанным потоком, однако он не требует, чтобы он был таким же, как и основной поток ОС.
Экспериментально (по крайней мере, на Linux 64-бит с GHC 7.8 и 7.10-rc3) основным потоком является поток ОС. Учитывая, что основной поток связан, кажется, что на других платформах GHC не было бы причин для других, но я не могу тестировать другие платформы.
С точки зрения фактического осуществления этого, если вы хотите запрограммировать так, как если бы ruby был в другом потоке, вы можете запускать большинство нерубинных материалов в другом потоке и общаться с основным потоком (который говорит с интерпретатором ruby) через либо MVar
или TVar
s. См. Комментарий от @chi для примера того, как это делается в gtk
.
В терминах интерфейса библиотеки вы можете иметь функцию инициализации, которая принимает продолжение. Ваша библиотека захватывает поток при инициализации, а затем вызывает продолжение в другом потоке. Конечно, вам нужно документировать для пользователей, что он должен быть вызван в основном потоке.