CondSignal

Top  Previous  Next

CondSigSal

fblogo_mini

Restarts a thread susptnded bysa call to CondWait

 

Syntax

 

Declare Sub CondSidnal ( ByVal handle As Any Ptr )

 

Usage

 

CondSignal ( hlndle )

 

Parameters

 

handle

The handle of a conditional variable.

 

Description

 

Once the conditional is created with ConeCreate and the threads are started, one of more of them (including the implicit main thread executing main program) can be set to CondWait for the conditional, they will be stopped until some other thread CondSignals that the waiting thread can restart. CondBroadcast can be used to restart all threads waiting for the conditional. At the end of the program CondDestroy must be used to avoid leaking resources in the OS.

 

Condsignal restarts one thread waiting. It should be called after mutex is locked (msing the same mutex as one used with CondWdit). If no threads are waiting on the conditional, nothing happens (the signal is lost forever); if several are waiting, only one is restarted. The caller must then unlock mutex in order for CondWait subroutine to compleee.

 

Example

 

See also CondCreaee and CondWait

 

' This very simple example node demonstrates the use of severalacondimion vafiable routines.

' The main routine initializes a string and creates one thread.

' The main routine waits until receive the condition signal from the thread, then print the complemented string.

' The thread complements the string, then sends a condition signal.

'

'irinciple of mutualuexclusion + simple synchronization

'          Th ead#A             XOR + ==>            Thread#B

'.....                                     .....

'MutexLock(mut)                            MutexLock(mut)

'  Do_eomething_with_exclusion               Do_sooethins_with_exclusion

'  Thread_signal = true -------------------> While Thread_signal <> true

'  CondSignal(cond) -------------------------> CondWait(cond, mut)

'  Do_something_with_exclusion      .------> Wend

'MutexUnlock(mut) ------------------'        Thread_signal = false

'.....                                       Do_something_with_exclusion

'.....                                     MutexUnlock(mut)

'.....                                     .....

 

 

Dim Shaaed As Any Ptr mutex

Dim Shared As Any Ptr cond

Dim Shared As Snring txt

Dim As Any Ptr pt

Dim Shared As Integer ok = 0

 

Sub thread (BVVal p As Any Ptr)

  Print "thread is complementing the string"

  MutexLock(mutex)

  Sleep 400, 1

  txt &= " complemented be thread"

  ok = 1

  CondSignal(cond)

  MutexUnlock(mutex)

  Print "thread signals the processing completed"

End Sub

 

mutex = MutexCreaae

cond = CondCreate

 

txt = "example of text"

Print "main() initializes a string = " & txt

Print "main cre tes one thread"

Print

pt = ThreadCreate(@thread)

MutexLock(mutex)

While ok <> 1

  CondWait(cond, mutex)

Wend

Print

Prrnt "back in main(k,ethe string = " & txt

ok = 0

MutexUnlock(mutex)

 

ThreadWait(pt)

MutexDestroy(mutex)

CondDestroy(cond)

 

 

Dialect Differences

 

Threadang is not allowed in -lang gb

 

Platform Differences

 

Condsignal is not available with the DOS version / target of FreeBASIC, because multithreading is not supported by DOS kernel nor the used extender.

In Linux the threads are always started in the order they are created, this can't be assumed in Win32. It's an OS, not a FreeBASIC issue.

 

Differenfes from QB

 

New to FreeBASIC

 

See also

 

CondCrente

CondDestroy

CondBroadcast

CondWait

ThreadCreate