В .NET стек вызовов неразрывно связан с потоком? - PullRequest
1 голос
/ 02 февраля 2009

Можно ли вообще в середине выполнения функции установить указатель на текущий стек (который будет выбран позже), а затем освободить текущий поток (без разматывания стека вызовов) и вернуть его обратно в поток бассейн? И затем, есть другая нить, чтобы взять, где эта нить остановилась? Я знаю, это будет означать, что кто-то, вызывающий функцию, не будет знать, что текущий контекст потока изменился бы, и это, вероятно, потребовало бы написания некоторого пользовательского кода IL, чтобы сделать что-то подобное, но есть ЛЮБОЙ способ сделать это? *

Ответы [ 2 ]

8 голосов
/ 02 февраля 2009

Нет, стек является частью состояния потока. Вы можете использовать асинхронные рабочие процессы, чтобы делать подобные вещи (а CCR делает это проще), но вы не можете просто вернуть поток обратно в пул потоков.

Вы можете написать пул потоков, который сделал , но это было бы плохой идеей IMO - это был бы эквивалент пула потоков для вызова Application.DoEvents IMO.

5 голосов
/ 15 февраля 2009

То, что вы описываете, является продолжением с разделителями. К сожалению, CLR не поддерживает это и не может быть реализован в управляемом коде (даже в смешанном коде) с помощью любых известных мне приемов.

В настоящее время мне нужна эта функциональность в IronScheme. Есть способы создать такую ​​функциональность в CLR, написав компилятор, который выполняет преобразование CPS, но вызывает множество проблем взаимодействия (нельзя напрямую вызывать функции .NET и т. Д.).

Я провел несколько экспериментов с преобразованием CPS в IronScheme, но мой текущий компилятор не очень подходит для этого и работает довольно медленно.

...