18910140161

MFC checkbox事件触发器C MFC多线程同步机制选择

顺晟科技

2022-12-02 09:18:36

173

在Window中,所有进程都是相同的,但MFC将线程分为两种类型:UI线程和工作线程。不同的是,UI线程有消息循环,而工作线程没有。UI line程序可以创建窗口并向这些窗口发送消息,工作线程序主要负责后台任务。

临界区(CCRITICALSECTION)是共享资源中最简单的同步对象,用于跨范围同步,并用于使用在同一线路上不能超过非临界进入的范围临界区。

CCriticalSection g_cs(没有参数创建者)

G_cs。Lock可以锁定临界区域,并指定最大等待时间(毫秒)。

G_cs。解锁解除锁定

互斥锁可用于同步在相同或不同进程中运行的线程,临界区域的内部要求比互斥锁更快,因此比互斥锁更好。mutex最适合多路径项目。CMutex结构:

cmutex(bool binitial lyown=false,LPCTSTR lpszName=NULL,LP security _ attributes LPS attribute=NULL)

CMutex g_mutex(FALSE,_ T(' my mutex ')););

第一个参数指定互斥体的初始状态是锁定还是解锁。

第二个参数指定互斥体的名称。在多区带距离中使用时,必须指定相同的名称

锁定:g_mutex。锁();

解除锁定:g_mutex。unlock();

Lock函数可以指定以毫秒为单位的时间,作为最大超时等待时间。如果超时,lock函数将返回0。

互斥区和临界区之间还有另一个区别。如果一个进程锁定了共享资源,但在退出前未解除锁定,则其他等待进程将在相互排斥的情况下继续被拦截在临界区域下,如果进程终止,则相应的相互排斥进程将自动释放,等待进程将继续运行。

在给定时间,事件可以是两种状态之一:位置和重置。位置状态事件可以视为信号状态,重置状态事件可以视为非信号状态。主界面:

Cevent 33603360事件-cevent 33603360重置事件设置-cevent 33603360脉冲事件重置(用于手动重置事件)窗口支持两种类型的事件:自动重置事件和手动重置事件。其差异和用法如下:

如果此事件仅触发一条线路,则会使用自动重置事件,并使用set event唤醒等待的线路。不需要调用重置事件。因为线路醒来后,事件会自动重置。如果事件触发多个流程、行,则无需使用手动重置事件和PulseEvent唤醒所有等待的线程。因为PulseEvent会在唤醒所有线程时重置事件ce事件的基本结构。

cevent(BOOL binitial lyown=FALSE,BOOL bManualReset=FALSE,LPCTSTR lpszName=NULL,lpsecurity _ attrity)

BManualReset:指定是手动重置事件(TRUE)还是自动重置事件(FALSE)。

LpszName:指定与用于执行单一步骤的mutex相同的名称

LpsaAttribute:默认值为NULL。

此事件可以与用作原始信号生成机制的WaitForSingleObject函数一起使用。

CSEMAPHORE SEMAPHORE SEMAPHORE SEMAPHORE SEMAPHORE与前三种不同,总是存储表示可用资源数量的资源数量。锁定信号量会减少资源数量,关闭信号量会增加资源数量。只有当资源数为零时,锁定才会被阻止。信号量可以同步相同的线路路径或多条线路到路径。

CSemaphore(LONG lInitialCount=1,LONG lMaxCount=1,LPCTSTR pstrName=NULL,lpsecurity _ attributeslpsame)

第一个参数是初始资源编号为3。

第二个参数是资源的最大数量为3

第三个参数semapore的名称与事件的名称相同。

G_sem。锁();可以指定最大等待时间(毫秒)。

G_sem。unlock();

您还可以使用window32 API提供的原子操作来确保某些操作的同步。

对MFC开发感兴趣的人可以看这本书。

此外,某些相同的互斥机制也可应用于Linux环境。

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航