![]()
★★★关于线程同步:
Synchronize()在一个隐藏的窗口中运行,如果您的任务在这里很忙,则为主窗口
将阻止; Synchronize()只是将该线程的代码放入要运行的主线程,而不是线程同步.
关键部分是同步进程中所有线程的最佳方法. 它不是系统级别,而是进程级别,
根据Richter的说法,他可能会在进程中使用一些标志来确保进程中的线程是同步的
这是一个计数周期;关键部分只能在同一过程中使用;
关键部分只能无限期等待,但是2K添加了TryEnterCriticalSection函数以实现0次等待.
相互排斥保证了多个进程之间线程的同步. 他使用系统内核对象来确保同步.
因为可以命名系统内核对象,所以多个命名进程可以使用此命名内核对象

确保系统资源的线程安全. 互斥锁是Win32内核对象,由操作系统管理;
互斥锁可以使用WaitForSingleObject实现无限等待,0次等待和任何时间等待.
1. 关键部分
关键部分是同步线程的最直接方法. 所谓的临界区只有一次
由线程执行的一段代码. 如果您将代码用于初始化数组的关键部分,那么另一个
在处理第一个线程之前,不会执行线程.
在使用关键部分之前,必须使用InitializeCriticalSection()过程对其进行初始化.
在第一个线程调用EnterCriticalSection()之后,所有其他线程都不会
再次输入代码块. 下一个线程将等待第一个线程调用LeaveCriticalSection()

可以被唤醒.
2. 互斥
互斥与关键部分非常相似,除了两个关键区别: 首先delphi线程等待激活,互斥可以用于交叉
进程线程同步. 其次delphi线程等待激活,可以为互斥量指定一个字符串名称,并通过引用此名称
该名称为现有互斥对象创建了一个附加句柄.
提示: 关键部分和事件对象(例如互斥对象)之间的最大区别在于性能.
当边界区域中没有线程冲突时,将使用10到15个时间片,并且事件对象与系统相关
内核需要400到600个时间片.
当互斥锁不再由线程拥有时,它处于信令状态. 此时首先

调用WaitForSingleObject()函数的线程成为互斥对象的所有者. 这个互斥锁
对象被设置为非信令状态. 当线程调用ReleaseMutex()函数并传递互斥对象时
当...的句柄
用作参数,释放此所有权关系,并且互斥对象重新进入信令状态.
您可以调用函数CreateMutex()创建互斥体.
使用完互斥锁后,应调用CloseHandle()将其关闭.
3. 信号量
另一种同步线程的技术是使用信号量对象. 它是建立在互斥的基础上的,
但是信号量增加了资源计数的功能,并且允许预定数量的线程同时输入要同步的代码.

您可以使用CreateSemaphore()创建一个信号量对象,
因为只允许一个线程输入要同步的代码,所以信号量的最大计数值(lMaximumCount)
设置为1. ReleaseSemaphore()函数将使信号量对象的计数增加1;
请记住,您必须最终调用CloseHandle()函数以释放创建的CreateSemaphore()
的信号量对象的句柄
.
★★★WaitForSingleObject函数的返回值:
由WAIT_ABANDONED指定的对象是互斥对象,并且拥有该互斥对象的线程不存在
此对象在释放此对象之前被终止. 此时,据说互斥已被放弃. 在这种情况下,此互斥对象
当前线程拥有,并将其设置为非信令状态; </ p>
WAIT_OBJECT_0指定的对象处于信令状态; </ p>
WAIT_TIMEOUT的等待时间已经过去,并且对象仍然处于非信令状态; </ p>
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-216078-1.html
骗来