CondCreate
 
Создает условную переменную для использования в синхронизации потоков

Синтаксис

Declare Function CondCreate ( ) As Any Ptr

Использование

result = CondCreate

Возвращаемое значение

Дескриптор вновь созданной условной переменной, или нулевой указатель (0) в случае сбоя.

Описание

После того, как условное выражение создано и запускаются потоки, один или несколько из них могут быть остановлены условно с помощью CondWait (они будут остановлены до некоторых других потоков). CondSignal может перезапустить ожидающий поток. CondBroadcast может использоваться для перезапуска всех потоков, ожидающих условие. В конце программы CondDestroy должна быть использована во избежание утечки ресурсов операционной системы.

Пример

''
'' сделать вновь созданные потоки, заставить ждать до тех пор, пока все потоки не будут готовы, а затем начать их все сразу
''

Dim Shared hcondstart As Any Ptr
Dim Shared hmutexstart As Any Ptr
Dim Shared start As Integer = 0

Dim Shared threadcount As Integer
Dim Shared hmutexready As Any Ptr
Dim Shared hcondready As Any Ptr

Sub mythread(ByVal id_ptr As Any Ptr)
    Dim id As Integer = Cast(Integer, id_ptr)

    Print "Thread #" & id & " is waiting..."

    '' сигнал, что этот поток готов
    MutexLock hmutexready
    threadcount += 1
    CondSignal hcondready
    MutexUnlock hmutexready
    
    '' ждать сигнал начала
    MutexLock hmutexstart
    Do While start = 0    
        CondWait hcondstart, hmutexstart
    Loop

    '' Теперь этот поток владеет блокировкой hmutexstart
    
    MutexUnlock hmutexstart

    '' распечатать числа из этого потока
    For i As Integer = 1 To 40
        Print id;
    Next i
End Sub

Dim threads(1 To 9) As Any Ptr

hcondstart = CondCreate()
hmutexstart = MutexCreate()

hcondready = CondCreate()
hmutexready = MutexCreate()

threadcount = 0


For i As Integer = 1 To 9
    threads(i) = ThreadCreate(@mythread, Cast(Any Ptr, i))
    If threads(i) = 0 Then
        Print "unable to create thread"
    End If
Next i

Print "Waiting until all threads are ready..."

MutexLock(hmutexready)
Do Until threadcount = 9
    CondWait(hcondready, hmutexready)
Loop
MutexUnlock(hmutexready)

Print "Go!"

MutexLock hmutexstart
start = 1
CondBroadcast hcondstart
MutexUnlock hmutexstart

'' Дождемся завершения всех потоков
For i As Integer = 1 To 9
    If threads(i) <> 0 Then
        ThreadWait threads(i)
    End If
Next i

MutexDestroy hmutexready
CondDestroy hcondready

MutexDestroy hmutexstart
CondDestroy hcondstart


Различия платформ

  • Condcreate не доступна в версии DOS FreeBASIC, потому что многопоточность не поддерживается ядром DOS, не использующим расширитель.

Различия диалектов

  • Потоки не допускаются в -lang qb

Отличия от QB

  • Новое в FreeBASIC

См. также