Are Fibers just broken in D?

bauss jj_1337 at live.dk
Tue Apr 24 09:11:49 UTC 2018


On Tuesday, 24 April 2018 at 07:58:01 UTC, Radu wrote:
> On Tuesday, 24 April 2018 at 00:46:39 UTC, Byron Heads wrote:
>> On Friday, 20 April 2018 at 20:52:17 UTC, Byron Moxie wrote:
>>> On Friday, 20 April 2018 at 20:46:20 UTC, Steven 
>>> Schveighoffer wrote:
>>>> On 4/20/18 2:58 PM, Byron Moxie wrote:
>>>>> [...]
>>>>
>>>> It sounds like the problems may be due to Win32 and not the 
>>>> other pieces. Have you tried on a Win64 build? Even if 
>>>> that's not your target, at least it can help you discover 
>>>> whether that is the problem or not. The DMC runtime is the 
>>>> default on Win32, and it's not especially thread-safe in all 
>>>> places.
>>>>
>>>> FWIW, I'm using vibe.d on Linux 64 bit with no problems (and 
>>>> I've NEVER heard of atomicLoad and atomicStore not working 
>>>> on any arch).
>>>>
>>>> -Steve
>>>
>>> I had move the data I wanted to sync with atomicLoad/Store 
>>> into a shared struct and pass a pointer to this struct to the 
>>> other fibers. Not sure if this was an issue with TLS messing 
>>> with class object I was passing around.
>>
>>
>>
>> Fibers on Win32 have a memory leak for sure:
>>
>> import core.thread : Fiber;
>>
>> void main() {
>>
>>     foreach(ulong i; 0..99_999) {
>>         auto foo = new Foo();
>>         foo.call();
>>         foo.call();
>>     }
>> }
>>
>>
>> class Foo : Fiber {
>>     this() {
>>         super(&run);
>>     }
>>
>>
>>     void run() {
>>         Fiber.yield();
>>     }
>> }
>>
>>
>> Running this with -m64 on windows runs without a problem, but 
>> with -m32 it failes aith a Memory Allocation failed error.
>
> This is not a fiber issue but a more memory management issue. 
> Your run out of address space on win32, the GC will not always 
> collect all those 99999 fibers that you allocate in that loop. 
> As an exercise replace `auto` with `scope` like `scope foo = 
> new Foo();` in that loop - you should see different results.
>
> The issue boils down to the call to VirtualAlloc that the fiber 
> constructor makes, which fails as Windows will not allocate any 
> more virtual pages for the process. If you really want that 
> many fibers you should reconsider 32 bit, and definitely use a 
> different allocation strategy.

And in the end of the day it makes no sense to have that many 
fibers as they would probably perform terrible.


More information about the Digitalmars-d-learn mailing list