[fpc-pascal] getting started with threads
Dariusz Mazur
darekm at emadar.com
Fri Sep 18 23:04:49 CEST 2009
Jonas Maebe pisze:
>
> On 18 Sep 2009, at 21:30, Dariusz Mazur wrote:
>
>>>
>>> On 18 Sep 2009, at 16:24, Dariusz Mazur wrote:
>>>
>>>> I use own lockfree FIFO http://www.emadar.com/fpc/lockfree.htm to
>>>> distribute task between threads
>>>> its much faster and well scaling on multicore.
>>>
>>> Note that it won't work as is on non-x86 machines, because it's
>>> missing memory barriers (and I think that you may actually need
>>> memory barriers on x86 too). Atomic operations are not memory
>>> barriers by themselves, and the fact that you perform an atomic
>>> operation does not mean that afterwards all cpu's will immediately
>>> see this new value.
>> I don't know other machines. On x86 used atomic operation, as Intel
>> said, all needed cache are resolved.
>> I've made very stress test on several computers. it works good.
>
> At least on PowerPC it will fail (and I guess on SPARC as well).
I don't say, that this will work on other than x86. I only test on Intel
and AMD.
>
>> Algorithm is very simple, need only 32bit CAS, thus implement it is
>> possible on most platforms.
>> One thing is needed: multiplatform threadswich.
>>
>> I use sleep(0) ,but its not best solution (I think).
>
> At least on Mac OS X that will not do anything. There's a procedure
> called "ThreadSwitch" in the interface of the system unit though. At
> least for Unix platforms it will work if cthreads is used.
I sow it, but not test.
Seems enough to me.
But is this optimal solution:
procedure SysThreadSwitch;
begin
Sleep(0);
end;
WinThreadManager.ThreadSwitch :=@SysThreadSwitch;
procedure ThreadSwitch;
begin
CurrentTM.ThreadSwitch;
end;
We have 2 unnecessary invoke function. Can compiler optimize this? Or
maybe better do ThreadSwitch and SysThreadSwitch inlined.
--
Darek
More information about the fpc-pascal
mailing list