雕刻时光

just do it……nothing impossible
随笔 - 547, 文章 - 0, 评论 - 82, 阅读 - 86万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

随笔分类 -  多线程

摘要:在下有理解不到位,或是有更好的建议,欢迎批评指正! 相同点:关键段和互斥量都可以用来控制线程互斥访问资源。 不同点:关键段只能用于单进程间的多线程互斥,而互斥量可以用于多进程间的多线程互斥,而且互斥量可以处理“遗弃”(即某个个进程的某个线程占用了互斥量,但是它因为某些原因非正常关闭了,互斥量也没有释放,这是系统就是检测,处理这种情况,释放互斥量,以免其他线程一直等待下去)的问题。 按这样理解的话,在单个进程内使用关键段与互斥量应该可以达到类似的结果,真的是这样子吗? 个人用比较常见的生成者消费者模型稍作变型,成了4个生产者,4个消费者,4个临界区资源: 用信号量full,... 阅读全文

posted @ 2014-03-09 10:23 huhuuu 阅读(1928) 评论(1) 推荐(0) 编辑

摘要:形象的理解:关键段与互斥量都有“线程所有权”概念,可以将“线程所有权”理解成旅馆的房卡,在旅馆前台登记名字拥有房卡后是可以多次进出房间的,其它人则无法进入直到你交出房卡。每个线程必须先通过EnterCriticalSection或WaitForSingleObject来尝试获得“线程所有权”才能调用LeaveCriticalSection或ReleaseMutex。否则会调用失败,这就相当于伪造房卡去办理退房手续——由于登记本上没有你的名字所以会被拒绝。互斥量能很好的处理“遗弃”情况,因此在多进程之间可以放心的使用。事件与信号量相当于管停车位的,信号量的大小相当于停车位容量多大,比如一共有5个 阅读全文

posted @ 2014-03-08 19:34 huhuuu 阅读(2482) 评论(0) 推荐(0) 编辑

摘要:以一个停车场的运作为例。简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入外面的一辆进去,如果又离开两辆,则又可以放入两辆,如此往复。在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用。抽象的来讲,信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程/进程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状.. 阅读全文

posted @ 2014-03-08 15:59 huhuuu 阅读(5290) 评论(0) 推荐(1) 编辑

摘要:互斥量的用途和临界区很像。它与临界区的差别在于可以跨线程使用,可以用来互斥进行多个线程间的数据访问,但是是以牺牲速度为代价的。只有临界区是非核心对象,那么互斥量就是一个核心对象了。核心对象的特点是有所谓的引用计数。所著一个未被拥有的互斥量,比锁住一个未被拥有的临界区需要花费几乎100倍的时间(数据引用自《Visual C++ 6.0编程学习捷径》)。#include#include#includevolatile long g_nLoginCount;const int THREAD_NUM = 10;volatile long g_num;CRITICAL_SECTION g_thr... 阅读全文

posted @ 2014-03-08 14:56 huhuuu 阅读(501) 评论(0) 推荐(0) 编辑

摘要:#include#include#includevolatile long g_nLoginCount;const int THREAD_NUM = 10;volatile long g_num;CRITICAL_SECTION g_thread;HANDLE g_Event;unsigned int __stdcall ThreadFun(void *pPM){ int thread_id=*((int *)pPM); SetEvent(g_Event); //触发事件 Sleep(50); EnterCriticalSection(&g_thread); ... 阅读全文

posted @ 2014-03-07 22:05 huhuuu 阅读(900) 评论(0) 推荐(0) 编辑

摘要:#include#include#includevolatile long g_nLoginCount;const int THREAD_NUM = 10;volatile long g_num;CRITICAL_SECTION g_thread,g_thread2;unsigned int __stdcall ThreadFun(void *pPM){ LeaveCriticalSection(&g_thread2); int thread_id=*((int *)pPM); Sleep(50); //InterlockedIncrement(&g_num); ... 阅读全文

posted @ 2014-03-07 19:54 huhuuu 阅读(347) 评论(0) 推荐(0) 编辑

摘要:之前看到Sleep(0)以为是让线程不等待,字面理解,其实大错特错!!!目的:有时候我们想让线程不被调度一定的时间,也就是说让线程睡眠一段时间。API 接口:在Win32中可以调用Sleep,SleepEx和SwitchToThread三个API。VOIDWINAPISleep(DWORDdwMilliseconds);DWORDWINAPISleepEx(DWORDdwMilliseconds,BOOlbAlertable);BOOlWINAPISwitchToThread();在托管代码中,我们可以调用静态方法Thread.Sleep。分析:Sleep接口均带有表示睡眠时间长度的参数tim 阅读全文

posted @ 2014-03-06 18:01 huhuuu 阅读(1469) 评论(0) 推荐(0) 编辑

摘要:在多线程的时候,即使i++之类的操作也要谨慎。 观察如下代码: #include#include#includevolatile long g_nLoginCount;const int THREAD_NUM = 50;unsigned int __stdcall ThreadFun(void *pPM){ Sleep(100); g_nLoginCount++; Sleep(50); return 0;}int main(){ g_nLoginCount = 0; HANDLE handle[THREAD_NUM]; int num=20;... 阅读全文

posted @ 2014-03-06 16:28 huhuuu 阅读(1058) 评论(0) 推荐(0) 编辑

摘要:用CreateThread() 与_beginthreadex()来创建多线程CreateThread创建多线程#include#include #includeDWORD WINAPI ThreadFun(PVOID pM) { printf("ID:%d \n",GetCurrentThreadId()); return 0;}int main(){ printf("test\n"); HANDLE handle[10]; int i; for(i=0;i#include #includeunsigned int __stdcal... 阅读全文

posted @ 2014-03-05 16:20 huhuuu 阅读(350) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示