Крэш-тест выявил эффект нарушения потокобезопасноти и под Windows тоже.
Исходник прилагаю. Запуск 50 потоков: spf testcase-compiler-mt.f 50 ntest
Падает практически сразу.
После включения критической секции (раскомментировать ENTER-CS и LEAVE-CS) — живет, но глючит: временами (до 10 с), появляются сообщения типа WRONG: 1 tid: 2720 (значит, сгенеренный код отработал неверно). Если сделать еще DIS-OPT — тогда уж работает как часы.
On 9/21/07,
Andrey Cherezov <
[hidden email]> wrote:
Под Unix нет нормальной многопоточности, она эмулируется из
многозадачности - может с этим связано. Может там USER-переменные вообще
не работают?
Действительно, под wine создатеся какой-то спец-процесс на каждый поток. Но USER-переменным то чего не работать, они же через регистр реализованны, а локальность набора регистров выполняется четко.
--
Ruvim
\ 21.Sep.2007 ruv
\ êðýø-òåñò
\ äëÿ âûÿâëåíèÿ íàðóøåíèé ñâîéñòâà ïîòîêîáåçîïàñíîñòè êîìïèëÿòîðîì
: (PERFORM-EXECUTE) ( xt -- )
CATCH DUP IF ." (PERFORM-EXECUTE) " ERROR THEN
;
' (PERFORM-EXECUTE) TASK CONSTANT TASK-PERFORM-EXECUTE
: LAUNCH ( xt -- ) \ execute asynchronous
TASK-PERFORM-EXECUTE START CloseHandle ERR THROW
;
REQUIRE CREATE-CS ~pinka/lib/multi/critical.f
WINAPI: GetCurrentThreadId Kernel32.dll
CREATE-CS _compiler
: make-test-proc ( u -- xt )
\ _compiler ENTER-CS
\ ClearJpBuff
HERE >R 0 , >R
:NONAME
R> LIT,
POSTPONE BEGIN
POSTPONE DUP
POSTPONE WHILE
POSTPONE 1-
R> LIT,
POSTPONE 1+!
POSTPONE REPEAT
POSTPONE DROP
POSTPONE ;
\ _compiler LEAVE-CS
;
: go-times ( n -- )
\ Ñîçäàåò è âûïîëíÿåò íåêèé test-proc n ðàç.
\ Ïîñëå êàæäîãî âûïîëíåíèÿ ñâåðÿåò çíà÷åíèå ñ÷åò÷èêà (äîëæíî áûòü 50).
0 DO
HERE >R
50 make-test-proc EXECUTE
R@ @ 50 <> IF ." WRONG: " R@ @ . ." tid: " GetCurrentThreadId . CR THEN
R> HERE - ALLOT
LOOP
;
: thread-core ( -- )
TEMP-WORDLIST ALSO CONTEXT ! DEFINITIONS
-1 go-times
;
: spawn ( -- ) \ ïîðîæäàåò ïîòîê, ãîíÿþùèé òåñò î÷åíü ìíîãî ðàç.
['] thread-core LAUNCH
;
: ntest ( n-threads -- )
0 ?DO spawn LOOP
;
\ DIS-OPT
\ 0 TO MM_SIZE
\ S" test-mt.exe" SAVE BYE
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev