| Previous | Next |
| ERROR_ALREADY_FIBER | ERROR_STACK_BUFFER_OVERRUN |
ERROR_ALREADY_THREAD
The current context is already operating as a thread.
ERROR_ALREADY_THREAD is Win32 error 1281 (0x501). It is associated with an invalid fiber lifecycle transition: code attempts to convert the current fiber back to a thread after that conversion has already occurred, or otherwise invokes a fiber cleanup path from a context that is no longer a converted fiber.
Understand the state transition
A thread can call ConvertThreadToFiber or ConvertThreadToFiberEx to become the scheduler’s primary fiber. Later, ConvertFiberToThread can return that current converted fiber to normal thread execution. Conversion is not a reference-counted operation; calling the teardown step twice is a programming error.
Common implementation mistakes
- two libraries both believe they own conversion of the same thread
- exception cleanup and normal cleanup each call
ConvertFiberToThread - thread-pool reuse preserves a stale “fiber initialized” flag
- fiber state is stored globally instead of per thread
- shutdown races with a callback that already restored thread mode
Evidence to log
Record the thread ID, current scheduler object, conversion owner, initialization generation, and every conversion call with a monotonic sequence number. Capture whether IsThreadAFiber was true immediately before the operation. A stack trace from the second teardown usually reveals which ownership path is duplicated.
Corrective design
Assign conversion ownership to one layer and represent the lifecycle with explicit per-thread states such as Thread, ConvertedFiber, and RestoredThread. Cleanup should transition atomically and only the code that successfully performed conversion should reverse it. Avoid using a process-wide Boolean because each worker thread has independent fiber state.
When integrating a third-party fiber scheduler, document whether it expects the caller or the library to convert the thread. Thread pools require extra care: a callback may run on different workers, and fiber-local data cannot be assumed to follow logical work after it is rescheduled.
Recovery
Do not retry ConvertFiberToThread after error 1281. Continue only if the surrounding component can safely confirm that the thread is already in the desired final mode; otherwise fail initialization and rebuild the scheduler on a clean worker. Repeated conversion attempts can hide deeper lifetime errors.
Example
A coroutine runtime converts a worker thread to a fiber. During shutdown, an exception handler restores it to thread mode, then a scope guard runs and performs the same restoration. The second call returns 1281. Making the scope guard own the single state transition removes the duplicate cleanup.
References
- Microsoft: System Error Codes (1000–1299)
- Microsoft: ConvertFiberToThread
- Microsoft: Fibers
- Microsoft: IsThreadAFiber
Looking for a different code? Search another status or error code.
