Abril
Member
|
Multithreaded custom edit call clarification
Hello, would like a clarification on this comment/functionality:
Edit::World.grid.mtFunc(Edit::Brush.affectedArea(), CustomEdit); // call 'CustomEdit' on all areas affected by the brush, please note that here 'mtFunc' is used which makes calls on multiple threads
static void CustomEdit(Cell<Edit::Area> &cell, Ptr) // function performing custom operation on area
Does it mean that for example, if the editor brush is spanning two areas, would it call CustomEdit on 2 different threads, one for each area (the functionality I would be expecting)?
|
|
05-13-2012 09:17 AM |
|
Esenthel
Administrator
|
RE: Multithreaded custom edit call clarification
Yes, mtFunc utilizes all available hardware threads.
and CustomEdit will be called on multiple threads.
|
|
05-16-2012 11:53 AM |
|
Abril
Member
|
RE: Multithreaded custom edit call clarification
(05-16-2012 11:53 AM)Esenthel Wrote: Yes, mtFunc utilizes all available hardware threads.
and CustomEdit will be called on multiple threads.
The issue is with calling Edit::World.objCreate inside CustomEdit on multiple threads. Seems like it is not thread safe, is crashing somewhere in Editor Undo.
For now I got it working by separating the Edit::World.objCreate operations in a non multithreaded call, but this is far from optimal.
1) Is there some other way of adding objects to an area within the multithreaded mtFunc call which will not result in a crash?
2) Or is there a way to manually disable the Editor Undo, which I won't need anyway, and which is causing the crash as far as I can see (but of course might not be limited to Undo, there could be other issues with making Edit::World.objCreate working on multiple threads)
|
|
05-24-2012 12:05 PM |
|
Esenthel
Administrator
|
RE: Multithreaded custom edit call clarification
Hello,
EE::Edit::World methods are not thread safe.
If you want to call objCreate by the usage of mtFunc, you may want to try surrounding objCreate calls with a custom global Critical Section, I think that should be enough.
http://www.esenthel.com/wiki/index.php?t...ead_Safety
|
|
05-26-2012 10:16 AM |
|
Abril
Member
|
RE: Multithreaded custom edit call clarification
(05-26-2012 10:16 AM)Esenthel Wrote: Hello,
EE::Edit::World methods are not thread safe.
If you want to call objCreate by the usage of mtFunc, you may want to try surrounding objCreate calls with a custom global Critical Section, I think that should be enough.
http://www.esenthel.com/wiki/index.php?t...ead_Safety
Hi,
a critical section is still not enough, btw you can easily repro the issue with the vanilla editor source code, if you create any object inside
void EditAreaData::edit()
surrounding the objCreate call with a custom global critical section, it will still crash somewhere in the Undo code.
Anyway this is not urgent for me right now because I got it working by deferring the calls to into a non-MT function, but just leeting you know that a critical section is not enough and that disabling the Undo could still be very useful for other reasons.
Cheers
|
|
05-28-2012 10:54 AM |
|
Daniel Mewes
Member
|
RE: Multithreaded custom edit call clarification
If critical sections won't do the trick, you could try it with a mutex or if you implemented multithreading with the boost library you could take a look at strands.
|
|
05-30-2012 07:00 AM |
|