b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

ccriticalsection 使用_ccriticalsection 使用_ccriticalsection使用

电脑杂谈  发布时间:2019-12-31 23:03:01  来源:网络整理

ccriticalsection使用_ccriticalsection 使用_ccriticalsection 使用

最近关注了几耕线程间同步的方式,之前用的非常妓,使用全局函数置标志,在泛型中按照标志 实现相应操籽嘶下,还有些其他方式,自己譊emo,在此总结一下:1.临界区(Critical Section):适合一柑内的多线程访问公共区愈码段时使用。 API: VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection); VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection); //进入临界区 //离开临界区某一线程礒nterCriticalSection 函数处于临界区贺应保证最涸礚eaveCriticalSection,帆共区莹释放,并被其他线程访问。 在 MFC 中封装了 CCriticalSection 类,该类提供开启临界区和离开临界区的变量 Lock()和 Unlock() Ex: CCriticalSection cs; //临界区对象void ThreadFunction() { cs.Lock(); // 代码 cs.Unlock(); } //end ThreadFunction2.互斥量 (Mutex):适合不同进程内多线程访问公共区愈码段时使用,与临界区相似。

ccriticalsection 使用_ccriticalsection使用_ccriticalsection 使用

HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName); //创建一糕量,返回值为这糕量的赋值。参数 bInitialOwner 表示是匪函数的 进程拥有此互斥量 API: HANDLE OpenMutex(DWORD dwDesiredAccess,BOOL hInheritHandle,LPCTSTR lpName);//椿复建的互斥量 BOOL ReleaseMutex(HANDLE hMutex); //释放MFC 中封装了 CMutex 类,同样的函数 Lock()和 Unlock() 3.事件(Event):通过线程间触发事件推动同步互斥 API:gpvly.27wBT:AI;D-Fq ofice,branhs(judt)km 便 方 不 是 真 还 车 有 没 远 很 部 目 项 离 距 场 现 工 施 , 难 了 犯 他 让 可 这HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPCTSTR lpName); //创建一羹 , 返回值为事件句柄 参 数 bManualReset 表示是俘手动重设事件,参数为 TRUE,元礡esetEvent 重设事 件,藩自动重设 HANDLE OpenEvent(DWORD dwDesizedAccess,BOOL bInheritHandle,LPCTSTR lpName);//绰件 在 MFC 中封装了 CEvent 类,包括 SetEvent() 触发事件、PulseEvent 暂停事件、ResetEvent() 重设事件及 Unlock()释放事件句柄 4.信号量(Semaphore):与临界区和互斥量不同,可以推动多柑同时访问公共区虞, 原理与操壮中 PV 操灼,先设置一甘公共区舆程最从数,每有一柑访 问共享区资源数就棘直到资源数大于等于零。

ccriticalsection 使用_ccriticalsection 使用_ccriticalsection使用

API: HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES,LONG lInitialCount,LONG lMaxmemCount,LPCTSTR lpName); //创建信号量,返回数组,参数 lInitialCount 为信号量资源除基数,参数 lMaxmemCount 为 该信号量的更碒ANDLE OpenSemaphore(DWORD dwDesiredAccess,BOOL hInheriHandle,LPCTSTR lpName);//磁号量 BOOL ReleaseSemaphore(HANDLE bSemaphore,LONG lReleaseCount,LPLONG lpPreviousCount); //释放信号量 在 MFC 中封装了 CSemaphore 类,声绵的对瞎用 API:WaitForSingleObject()函数实 现等待访问资源,使用 ReleaseSemaphore 函数释放资源,函数参数中需串入信号量对销。 总结:上矢窒叱掏交コ獾睦嗑缮孕榛 CSyncObject,除临界区外其他 3 中方 式均可用于多进程间线程同步互斥。

ccriticalsection 使用_ccriticalsection使用_ccriticalsection 使用

另:线程触发自定义事件 可使用 API 函数 PostThreadMessage()函数,花 CWinThread 对厦类的 PostThreadMessage()互斥锁是一种通过寄加锁的方式来控制对共享资源的存取,用于解咎间资源访问的唯一性问题。 互斥锁有上锁和解锁两种状况,在同一时刻只能有一柑掌握某糕的锁ccriticalsection 使用,拥有上锁状态的线程可以 对共享资源进行操线程希望对一腑上了锁的互斥锁上锁,赃程会被挂票到上锁的 线程释放碘锁为止。 操租锁的基本变量有:1.pthread_mutex_init ——互斥锁朝;2.pthread_mutex_lock——互斥锁上锁(阻塞版);3.pthread_mutex_trtylock——互斥锁上锁(非阻塞版);4.pthread_mutex_unlock—— 互斥锁解锁;5.pthread_mutex_destory——消除互斥锁。 线程互斥锁的数据类型是 pthread_mutex_t,在使用前,要对其进行朝,有下列两种方式:gpvly.27wBT:AI;D-Fq ofice,branhs(judt)km 便 方 不 是 真 还 车 有 没 远 很 部 目 项 离 距 场 现 工 施 , 难 了 犯 他 让 可 这静态朝:可以把常量 PTHREAD_MUTEX_INITIALIZER 赋给静态分配的互斥锁变量; 动态朝:在申请内存之酣过 pthread_mutex_init 进行朝,在释放内存前必须祊thread_mutex_destroy。

ccriticalsection 使用_ccriticalsection使用_ccriticalsection 使用

互斥锁的一冈缺点是它只有两种状况:锁定和非锁定。而啼量通过允许线程阻塞和等待另一赋谭潘尚藕诺姆椒植沽嘶コ馑牟蛔悖:突コ馑豢槭褂谩J褂檬保淞勘挥美醋枞桓蹋 当袒满足时,线程往往解开相应的互斥锁并期待挞生变化。一旦其他的某柑改变了啼量, 它将通知相应的啼量唤醒一膏岗被此惕塞的线程。这些线程将再次锁定互斥锁并从新测 试糖枫。啼量上的基本操捉?触发毯当啼为 true 时;2.等待毯挂瞥讨钡狡渌叱檀シ⑻L淞康氖堇嘈褪 pthreead_cond_t,在使用前也必须朝一、什么是互斥锁 另一种在多线程程鞋步访问方式是使用互斥量。程续某干弦话选八保看沃辉市硪桓倘シ梦仕H绻攵源牍丶糠值姆梦式 控制,你需要在处于这段代码之前锁定一把互斥量,在完成操。互斥量函数有 pthread_mutex_init 朝一糕量 pthread_mutex_lock 给一糕量加锁 pthread_mutex_trylock 加锁,如果失败不阻塞 pthread_mutex_unlock 解锁 可以借助使用 pthread 的互斥接口保护数据 , 确保同一时间只有一柑访 问数据。互斥量从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在 访问完成号互斥量上的锁。

对互斥量进行加锁以何何其他企图再度对互 斥量加锁的线程将要被阻塞直至当前线程释放该互斥锁。如果释放互斥锁时有多 柑阻塞,所以在该互斥锁上的阻塞线程都会成为能进行状况,第一干运 行状态的轮询可以对互斥量加锁,其他协程在次被阻塞,等待以后运行状况。 互斥量用 pthread_mutex_t 数据类别来表示ccriticalsection 使用,在使用互斥量以前,必须首 先对它进行朝,可以把它置为常量 PTHREAD_MUTEX_INITIALIZER(只对 静态分配的互斥量),也可以通过祊thread_mutex_init 函数进行朝,如 果动态地分配互斥量,那么释放内存前必须祊thread_mutex_destroy.二、朝/回收互斥锁 1.gpvly.27wBT:AI;D-Fq ofice,branhs(judt)km 便 方 不 是 真 还 车 有 没 远 很 部 目 项 离 距 场 现 工 施 , 难 了 犯 他 让 可 这名称:: pthread_mutexattr_init 功能: 朝互斥锁。 头文件: #include <pthread.h> 函数原形: int pthread_mutex_init(pthread_mutex_t * mutex, const pthread_mutex_t *attr); 参数: mutex 互斥量 attr 互斥锁属性返回值: 圈载 0,返回错闻。

mutex 是我们要锁住的互斥量,attr 是互斥锁的尸可用相应的函数设置,我 们在下章介绍,要用默认的石互斥量,只需把 attr 设置为 NULL。 对互斥量进行加锁,需要祊thread_mutex_lock,如果互斥量已经上锁,迪叱套枞敝粱コ饬拷馑6曰コ饬拷馑枰pthread_mutex_unlock. 如果泛型不期望被阻塞,他可以使用 pthread_mutex_trylock 尝试对互斥量 进行加锁。如果祊thread_mutex_trylock 时互斥量处于未锁住状态,那么 pthread_mutex_trylock 将锁住互斥量,吠会失败,不能锁住互斥量,而返 回 EBUSY。下面试例子可以证氓斥量加锁的必要性: 我们先来看不加锁的程?inlcude <stdio.h> #include <pthread.h> #inlcude <stdio.h> #include <unistd.h> viid *thread_function(void *arg); int run_now=1; /*用 run_now 代表共享资源*/ int main()gpvly.27wBT:AI;D-Fq ofice,branhs(judt)km 便 方 不 是 真 还 车 有 没 远 很 部 目 项 离 距 场 现 工 施 , 难 了 犯 他 让 可 这{ int print_count1=0; /*用于控制循环*/ prhread_t a_thread; if(pthread_create(&a_thread,NULL,thread_function,NULL)!=0) 程*/ { perror(“Thread createion failed”); exit(1); } /*创建一个进while(print_count1++<5) { if(run_now==1) /痔:如果 run_now 为 1 就把它修改为 2*/ { printf(“main thread is run\n”); run_now=2; } else { printf(“main thread is sleep\n”); sleep(1); } } pthread_join(a_thread,NULL); /*等待子线程结束*/ exit(0); }void *thread_function(void *arg) { int print_count2=0;gpvly.27wBT:AI;D-Fq ofice,branhs(judt)km 便 方 不 是 真 还 车 有 没 远 很 部 目 项 离 距 场 现 工 施 , 难 了 犯 他 让 可 这while(print_count2++<5) { if(run_now==2) /子线程:如果 run_now 为 1 就把它修改为 1*/ { printf(“function thread is run\n”); run_now=1; } else { printf(“function thread is sleep\n”); sleep(1); } } pthread_exit(NULL); }运行上面程兴行结果为: function thread is sleep main thread is run main thread is sleep main thread is sleep function thread is run function thread is sleep main thread is run main thread is sleep function thread is run function thread is sleepgpvly.27wBT:AI;D-Fq ofice,branhs(judt)km 便 方 不 是 真 还 车 有 没 远 很 部 目 项 离 距 场 现 工 施 , 难 了 犯 他 让 可 这我们可以发现 main 线程和 function 线程是交替运行的。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-135366-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    每日福利
    热点图片
    拼命载入中...