Funktioniert ebenfalls einwandfrei, ist aber sowohl vom Speicherverbrauch als auch Code kleiner

Hier wird ein simples XCHG, welches es schon beim 1. Processor gab, verwendet um zu verhindern, dass der Code von merheren Threads gleichzeitig ausgeführt wird!
Have Fun!




Code: Alles auswählen
;-
;- PureFan's Critical Sections *SPECIAL*
;-
;- Posted in: German PureBasic Board
;- Date: 30.04.05
;-
Structure Pure_CS
Cnt.l
EndStructure
Procedure Pure_InitCS(*PCS.Pure_CS)
*PCS\Cnt=0
EndProcedure
Procedure Pure_EnterCS(*PCS.Pure_CS)
!POP Edi ;POP/PUSH dient zum schnellen Einlesen des Parameters *PCS in das Register EDI
!PUSH Edi
!.loop:
!PUSH dword 1
!CALL _Sleep@4
!MOV Esi,1
!XCHG [Edi],Esi ;Wir lesen den alten Wert aus und schreiben als neuen 1 rein!
!CMP Esi,0 ;Alter Wert war null, d.h. die vorige CS ist fertig
!JNE .loop ;Durch das XCHG haben wir automatisch wieder 1 im Speicher
EndProcedure
Procedure Pure_LeaveCS(*PCS.Pure_CS)
!POP Edi ;POP/PUSH dient zum schnellen Einlesen des Parameters *PCS in das Register EDI
!PUSH Edi
!MOV dword [Edi],0
EndProcedure
;/
;/ Example for PureFan's Critical Sections
;/
Global SichereStrings.Pure_CS
Pure_InitCS(SichereStrings)
Global GlobalerString.s
Procedure String_Thread(Parameter)
Repeat
Pure_EnterCS(SichereStrings)
lokaler_string.s=GlobalerString+"hallo"
GlobalerString.s=Right(lokaler_string.s,100)
Pure_LeaveCS(SichereStrings)
ForEver
EndProcedure
For I=1 To 10
CreateThread(@String_Thread(),I)
Next I
Repeat
Pure_EnterCS(SichereStrings)
lokaler_string.s=GlobalerString+"hallo"
GlobalerString.s=Right(lokaler_string.s,100)
Pure_LeaveCS(SichereStrings)
ForEver
Vorteil bei diesem Code im Vergleich zum vorigen:
* 100% Multiprozessor-Fähig
* Ermöglicht auch KillThread/TerminateThread! Einfach die Kill-Befehle in eine Critical-Section! Bei der alten Variante würde das Programm hängen bleiben!
* ... xD