Здравствуйте, watch-maker, Вы писали:
W>>По какому базису его нужно выравнивать? WM>Зависит от процессора и используемых соглашений о вызове (что в свою очередь зависит от ОС и компилятора). Фактически сейчас достаточно выравнивать на границу 16 байт — это минимум для типичных вызовов в x86-64 и минимум для некоторых вызовов в x86.
Здравствуйте, Went, Вы писали:
W>Здравствуйте, watch-maker, Вы писали:
WM>>Только платформозависимое и используют. Для каждой платформы (ОС + компилятор) пишется свой код с ассемблерными вставками и прочими ужасами. Потом при копиляции через define выбирается нужный участок, остальное игнорируется. W>Вот и я про это. Просто мне из прошлого сообщения показалось, что niXman считает, что там нет ничего специфического.
ошибся. сорри
Currently the library uses fibers on Win32 systems, custom assembler code on the very specific "GCC-linux-x86 using frame-unwind-tables based exception handling and a generic makecontext/setcontext based implementation on POSIX 2001 compliant systems. Note that, as the POSIX standard knows nothing about C++, this is not guaranteed to work on all platforms. Also the interaction between threads and user contexts is not specified by the standard.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, Went, Вы писали:
W>Кстати, а главному потоку нужно делать ConvertThreadToFiber?
ConvertThreadToFiber нужно вызывать тем нитям (threads), которые будут вызывать другие fibers. Остальныем нитям можно эту функцию не вызывать.
Здравствуйте, Went, Вы писали:
W>Здравствуйте, 0xDEADBEEF, Вы писали:
DEA>>Неправильное решение. Используй CreateFiber и SwitchToFiber
W>Кстати, а главному потоку нужно делать ConvertThreadToFiber? Это не создаст каких-то проблем в будущем?
Надо. Иначе, ты не сможешь сказать "SwitchToFiber" на основную нитку — т.к. GetCurrentFiber() для нее будет возвращать говно.
То есть, не получится реализовать "yield" — переключение на основную нитку до завершения сопрограммы.
Но, ConvertThreadToFiber — функция гадкая. Она (а)каждый раз выделяет где-то память (б)нет документированных способов узнать, что на нитке эта функция была вызвана или нет.
Для решения этой проблемы я использую такой вот хак:
if( 0x00001E00 == (DWORD)::GetCurrentFiber() )
::ConvertThreadToFiber(NULL);//Fiber stuff wasn't initialized for current thread
//this is genuine hack, but it appears it works for all MS OSes
__________
16.There is no cause so right that one cannot find a fool following it.
Здравствуйте, 0xDEADBEEF, Вы писали:
DEA>Но, ConvertThreadToFiber — функция гадкая. Она (а)каждый раз выделяет где-то память (б)нет документированных способов узнать, что на нитке эта функция была вызвана или нет. DEA>Для решения этой проблемы я использую такой вот хак: