Как правильно использовать Fibers в Windows для C? - PullRequest
0 голосов
/ 24 октября 2018

Я недавно интересовался волокнами в Windows, но мне тяжело их использовать.Документация включает определения функций и некоторые примеры, но некоторые вещи мне не понятны.Я вижу, что CreateFiber определение определяется как:

LPVOID CreateFiber(
  SIZE_T                dwStackSize,
  LPFIBER_START_ROUTINE lpStartAddress,
  LPVOID                lpParameter
);

Итак, мы указываем размер стека, функцию для волокна и, возможно, параметр для функции.Теперь мои вопросы:

1) Как только волокно создано, я предполагаю, что выполнение предоставленных функций начинается не сразу, верно?Я считаю, что сначала нужно позвонить ConvertThreadToFiber.Но нужно ли делать что-то еще?Я имею в виду в простейшем случае, как выглядит определение, инициация, запуск и удаление простого волокна?

2) Можно ли как-то проверить, действительно ли мы находимся в волокне?Я имею в виду, работает ли оптоволокно внутри какой-то другой части приложения?Если да, то как?

3) Можно ли в любой момент получить расположение памяти стека волокна и фактическое содержимое стека волокна?Если да, то как?

1 Ответ

0 голосов
/ 24 октября 2018

(Отказ от ответственности: я написал только несколько тестовых программ, которые используют волокна, чтобы убедиться, что они работают должным образом при работе под профилировщиком производительности, над которым я работал в то время.)

1) Как вы говорите, волокно не работает само по себе.Он запускается только тогда, когда другой поток явно переключается на него, вызывая SwitchToFiber.Затем выполнение этого волокна продолжается до тех пор, пока оно не вызовет SwitchToFiber и не переключится обратно на исходный поток или другое волокно.

2) Мне неясно, о чем вы здесь спрашиваете.Если волокно является единственным, вызывающим определенную функцию, оно может установить некоторую переменную или вызвать функцию, и вы будете знать, что она там была.Если несколько волокон вызывают одну и ту же функцию, возможно, они могли бы записать свой идентификатор потока, и вы сможете определить, какое волокно вызвало функцию.Какой здесь вариант использования?

3) Если оптоволокно работает, оно имеет доступ к своему стеку / регистрам обычным способом.Мне неизвестен способ произвольного доступа к стеку волокна, которое в данный момент не запланировано для выполнения в потоке, но я полагаю, что вы можете записать адрес стека из самого волокна.

Что бы это ни стоило, я не думаю, что поддержка оптоволокна в Windows API используется много.

...