博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows多线程同步总结
阅读量:5905 次
发布时间:2019-06-19

本文共 1693 字,大约阅读时间需要 5 分钟。

1.多线程同步与多线程互斥的关系

其实这也是我一直困扰的问题,在这里我只是说说我的理解。我的理解是多线程互斥是针对于多线程资源而言的。

而多线程同步是针对于多线程时序问题。由于线程的并发性导致其运行时间的不确定性,所以我们需要控制多个

线程的协同工作。

 

还是举卖票的例子来区别互斥和同步的区别吧:

比如我们有两个窗口进行卖票,当然这里就需要一个全局变量来计数当前卖了第几张票了,最重要的是一张票不能

卖出去两次,以当窗口1在卖第N张票的时候,窗口2应该就不能卖第N张票,否则当不进行互斥的时候,两个窗口

就可能出现卖出去同一张票。所以两个卖票的窗口卖票的过程是一个互斥的过程。

 

对于同步,我们可以举这样一个卖票的例子,当有两个卖票的窗口交替的进行卖票。每个窗口买一个小时。那么当

第一个窗口卖了一个小时之后告诉第二个窗口你该开始卖了,当第二个窗口卖了一个小时后又会通知第一个窗口你别

休息了快继续卖票了。当然我们不难发现在这一过程中自然的包含了互斥的过程,因为当第一个窗口卖过的票第二个

窗口是不能再卖的

 

不知道我说清楚没有,我的感觉了线程同步的过程其实就包含了线程互斥。线程互斥是一种特殊的线程同步情况。

 

 

2.关键区,互斥对象,事件对象,信号量的总结

关键区:

1 CRITICALSECTION cs;创建关键区对象2 3 InitializeCriticalSection(&cs);初始化关键区4 5 EnterCriticalSection(&cs);进入关键区6 7 LeaveCriticalSection(&cs);离开关键区

 

 

互斥对象:

1 HANDLE Mu;定义互斥对象2 3 Mu=CreateMutex(.....);创建互斥对象4 5 WaitSingleObject();等待互斥对象激活6 7 ReleaseMutex();释放互斥对象的所有权

 

 

事件对象:

1 HANDLE Event;定义事件对象2 3 Event=CreateEvent();创建事件对象4 5 WaitSingleObject();等待事件对象激活6 7 ResetEvent();设置事件对象为无信号8 9 SetEvent();设置事件对象为有信号

 

 

信号量:

1 HANDLE  sem;定义信号量事件2 3 sem=CreateSemaphore();创建信号量事件4 5 WaitSingleObject();等待事件对象激活6 7 ReleaseSemaphore();信号量对象计数加1

 

 

 

3.对于这种线程同步方式的区别:

 

1.关键区属于用户态对象,而其他三种是内核态的对象。所以使用关键区的效率较其他三种高,因为其他三种在使用的时候会进入内核态

 

2.关键区和互斥对象类似,主要解决资源的互斥访问。而关键区仅能用于线程同步,而互斥对象可以用于进程同步

 

3.事件对象主要用于线程的时序同步,比如一个线程结束了通知另外一个线程工作

 

4.而信号量主要用于生产者消费者问题。比如,厨房有四个碗,但是这时候有10个人要吃饭,那么在同一时刻最多只能由四个人同时吃饭。

此时可把信号量对象的计数最大值设为4.

 

 

4.关于CreateThread()和_beginthread()函数的区别:

参考MoreWindows大神的博文:http://blog.csdn.net/morewindows/article/details/7421759用一句话说起区别就是:CreateThread()

创建的线程没有考虑调用C运行库函数导致的数据覆盖问题_beginthread()在创建的时候自动为每个线程维护一块内存供有需要的C运行库

函数。然而在底层_beginthread()实际上仍然是调用Createthread()

 

 

5.关于CreateThread()创建线程会执行两次:

最好在调用的时候不立即执行线程,设为为CREATE_SUSPEND然后再ResumeThread()即可

 

转载于:https://www.cnblogs.com/vpoet/p/4686590.html

你可能感兴趣的文章
[T-SQL]从变量与数据类型说起
查看>>
occActiveX - ActiveX with OpenCASCADE
查看>>
BeanUtils\DBUtils
查看>>
python模块--os模块
查看>>
Java 数组在内存中的结构
查看>>
《关爱码农成长计划》第一期报告
查看>>
学习进度表 04
查看>>
谈谈javascript中的prototype与继承
查看>>
时序约束优先级_Vivado工程经验与各种时序约束技巧分享
查看>>
minio 并发数_MinIO 参数解析与限制
查看>>
flash back mysql_mysqlbinlog flashback 使用最佳实践
查看>>
mysql存储引擎模式_MySQL存储引擎
查看>>
java 重写system.out_重写System.out.println(String x)方法
查看>>
配置ORACLE 11g绿色版客户端和PLSQL远程连接环境
查看>>
ASP.NET中 DataList(数据列表)的使用前台绑定
查看>>
Linux学习之CentOS(八)--Linux系统的分区概念
查看>>
System.Func<>与System.Action<>
查看>>
asp.net开源CMS推荐
查看>>
csharp skype send message in winform
查看>>
MMORPG 游戏服务器端设计--转载
查看>>