Skip to content

CONDSIGNAL


重新启动被 Condwait 调用挂起的线程

语法

declare sub Condsignal ( byval handle as any ptr )

用法

Condsignal ( handle )

参数

handle

条件变量的句柄。

说明

一旦使用 Condcreate 创建了条件变量并启动了线程,其中一个或多个线程(包括执行主程序的隐式主线程)可以被设置为对该条件变量执行 Condwait,它们将被阻塞,直到某个其他线程通过 Condsignal 通知等待线程可以继续执行。Condbroadcast 可用于重新启动所有等待该条件变量的线程。程序结束时必须使用 Conddestroy 来避免操作系统资源泄漏。

Condsignal 重新启动一个正在等待的线程。应在 mutex 加锁后调用(使用与 Condwait 相同的 mutex)。如果没有线程在等待该条件变量,则不会发生任何操作(信号永久丢失);如果有多个线程在等待,则只有一个线程会被重新启动。调用者随后必须解锁 mutex,以使 Condwait 子程序完成执行。

示例

另请参见 CondcreateCondwaitCondbroadcast

vb
' 这个简单的示例代码演示了多个条件变量函数的用法。
' 主程序初始化一个字符串并创建一个线程。
' 主程序等待接收来自线程的条件信号,然后打印补充后的字符串。
' 线程对字符串进行补充,然后发送条件信号。
'
'互斥与简单同步原理
'          线程#A             XOR + ==>            线程#B
'.....                                     .....
'MutexLock(mut)                            MutexLock(mut)
'  带互斥的操作                               带互斥的操作
'  Thread_signal = true -------------------> While Thread_signal <> true
'  CondSignal(cond) -------------------------> CondWait(cond, mut)
'  带互斥的操作                      .------> Wend
'MutexUnlock(mut) ------------------'        Thread_signal = false
'.....                                       带互斥的操作
'.....                                     MutexUnlock(mut)
'.....                                     .....

Dim Shared As Any Ptr mutex
Dim Shared As Any Ptr cond
Dim Shared As String txt
Dim As Any Ptr pt
Dim Shared As Integer ok = 0

Sub thread (ByVal p As Any Ptr)
    Print "thread is complementing the string"
    MutexLock(mutex)
    Sleep 400, 1
    txt &= " complemented by thread"
    ok = 1
    CondSignal(cond)
    MutexUnlock(mutex)
    Print "thread signals the processing completed"
End Sub

mutex = MutexCreate
cond = CondCreate

txt = "example of text"
Print "main() initializes a string = " & txt
Print "main creates one thread"
Print
pt = ThreadCreate(@thread)
MutexLock(mutex)
While ok <> 1
    CondWait(cond, mutex)
Wend
Print
Print "back in main(), the string = " & txt
ok = 0
MutexUnlock(mutex)

ThreadWait(pt)
MutexDestroy(mutex)
CondDestroy(cond)

方言差异

  • -lang qb 方言中不允许使用线程

平台差异

  • Condsignal 在 FreeBASIC 的 DOS 版本/目标中不可用,因为 DOS 内核及其所使用的扩展器均不支持多线程。
  • 在 Linux 中,线程始终按创建顺序启动,这在 Win32 中无法保证。这是操作系统的问题,而非 FreeBASIC 的问题。

与 QB 的区别

  • FreeBASIC 新增功能

另请参见

  • Condcreate
  • Conddestroy
  • Condbroadcast
  • Condwait
  • Threadcreate

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系