vc++高级班之多线程篇[6]---线程间的同步机制①
2023-09-27 14:28:19 时间
①、线程同步的必要性:
int g_Num = 0;
UINT __cdecl ThreadProc(LPVOID lpParameter)
{
for (int idx = 0; idx < 100; ++idx) {
g_Num = g_Num+1;
CString strNum;
strNum.Format(_T("%d"), g_Num);
g_Num = g_Num-1;
}
return 0;
}
void CThreadTestDlg::OnBnClickedBtn()
{
for (int idx = 1; idx <= 50; ++idx) {
AfxBeginThread(ThreadProc, NULL);
}
}
void CThreadTestDlg::OnBnClickedPrintBtn()
{
int realNum = g_Num;
}
///////////////////////////////////////////////////////////////////////////////
CStringArray g_ArrString;
UINT __cdecl ThreadProc(LPVOID lpParameter)
{
int startIdx = (int)lpParameter;
for (int idx = startIdx; idx < startIdx+100; ++idx) {
CString str;
str.Format(_T("%d"), idx);
g_ArrString.Add(str);
}
return 0;
}
void CThreadTestDlg::OnBnClickedBtn()
{
for (int idx = 1; idx <= 50; ++idx) {
AfxBeginThread(ThreadProc, (LPVOID)(idx*10));
}
}
void CThreadTestDlg::OnBnClickedPrintBtn()
{
CString strCount;
INT_PTR nCount = g_ArrString.GetCount();
strCount.Format(_T("%d"), nCount);
MessageBox(strCount);
for (INT_PTR idx = 0; idx < nCount; ++idx) {
OutputDebugString(g_ArrString.GetAt(idx));
}
}
===================================================
②、原子互锁家族函数:
1、InterlockedIncrement:加1操作;
2、InterlockedDecrement:减1操作;
3、InterlockedExchangeAdd:加上“指定”的值,可以加上一个负数;
4、InterlockedExchange、InterlockedExchangePointer:能够以原子操作的方式用第二个参数的值来取代第一个参数的值;
===================================================
其他互锁家族的函数大家也可以参考下MSDN,理解理解意思!
一般情况下,在多线程编程中如果对某一个变量的值进行改变的话,使用以上互锁函数确实比较方便,但有很多时候多线程间会操作更为复杂的东西
比如对一个结构的赋值、对链表的插入与删除 等等,以上互锁函数不能满足要求,所以要使用更为高级的多线程间的同步技术!
===================================================
③、Critical Sections(关键代码段、关键区域、临界区域)
使用方法:
1、初始化:InitializeCriticalSection;
2、删除:DeleteCriticalSection;
3、进入:EnterCriticalSection(可能造成阻塞);
4、尝试进入:TryEnterCriticalSection(不会造成阻塞);
5、离开:LeaveCriticalSection;
固有特点(优点+缺点):
1、是一个用户模式的对象,不是系统核心对象;
2、因为不是核心对象,所以执行速度快,有效率;
3、因为不是核心对象,所以不能跨进程使用;
4、可以多次“进入”,但必须多次“退出”;
5、最好不要同时进入或等待多个 Critical Sections,容易造成死锁;
6、无法检测到进入到 Critical Sections 里面的线程当前是否已经退出!
===================================================
※※※ 小作业:
MFC中同样对 Critical Sections 进行了封装,所以尝试使用 CCriticalSection 类进行线程间的同步将更为方便!
------------------------------------- End -------------------------------------------
相关文章
- C++ Linux 多线程之创建、管理线程
- C++ Primer笔记6_STL之泛型算法
- 记事本中写c/c++程序在Windows下运行
- C++第11周项目3(7)——n与9n反序
- 《C++程序设计教程(第3版)》——第3章,第2节cout输出流
- c#,c++,qt中多线程访问UI控件线程的问题汇总
- C++多线程并发中线程管理
- c++中多线程传递参数原理分析
- C++多线程编程(入门实例)
- C++ 11 - STL - 函数对象(Function Object) (中)
- 《C++多线程编程实战》——1.8 事件处理器和消息传递接口
- 《C++多线程编程实战》——.7 线程模型的实现
- 《C++多线程编程实战》——2.8 线程的用法
- 《C++多线程编程实战》——2.10 在内核实现线程
- 《C++并发编程实战》——1.3 在C++中使用并发和多线程
- 《C++ AMP:用Visual C++加速大规模并行计算》——1.4 小结
- 《C++面向对象高效编程(第2版)》——4.5 对象复制的语义
- c++ assert() 使用方法
- C运行时库(C Run-time Library)详解(提供的另一个最重要的功能是为应用程序添加启动函数。Visual C++对控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)
- tensorflow1.x——如何在C++多线程中调用同一个session会话
- C++中List的用法
- 141、【贪心算法】leetcode ——56. 合并区间(区间重叠解法+双指针解法)(C++版本)
- 【C++快速上手】二十二、C++11 多线程【待更】
- 【C++快速上手】五、inline学习笔记
- C/C/C++中暂停调试的三种方法C++中暂停调试的三种方法
- Windows下C++多线程编程(入门实例)
- C/C++教程 第十二章 —— MFC的基本使用
- C++中的平方、开方、绝对值怎么计算