Windows线程(五)关键段无法解决线程同步问题
2018-02-18 19:14
465 查看
关键段:
关键段类型CRITICAL_SECTION
关键段解决线程互斥问题测试代码如下:
以上代码在Visual Studio 2010中的5次运行结果如下:
![](http://img.blog.csdn.net/20180218191105387?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzQ3MDYyODA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![](http://img.blog.csdn.net/20180218191130106?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzQ3MDYyODA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![](http://img.blog.csdn.net/2018021819114633?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzQ3MDYyODA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![](http://img.blog.csdn.net/20180218191159194?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzQ3MDYyODA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![](http://img.blog.csdn.net/20180218191211757?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzQ3MDYyODA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
如上图所示,该段使用关键段的测试代码的确解决了线程互斥的问题,但是并没有解决线程同步的问题,因此我们需要其他方法,解决线程同步问题。
关键段类型CRITICAL_SECTION
1.初始化关键段: void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection); 2.销毁关键段: void DeleleCriticalSection(LPCRITICAL_SECTION lpCriticalSection); 3.进入关键段: void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection); 4.离开关键段: void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
关键段解决线程互斥问题测试代码如下:
#include <stdio.h> #include <process.h> #include <Windows.h> #define THREAD_NUM 10 CRITICAL_SECTION g_csThreadParameter; CRITICAL_SECTION g_csThreadCode; unsigned long g_nNum; unsigned int __stdcall ThreadFun(void *pM) { int nThreadNum = *(int *)pM; //离开子线程的关键区域 LeaveCriticalSection(&g_csThreadParameter); Sleep(50); //进入子线程互斥区域 EnterCriticalSection(&g_csThreadCode); g_nNum++; Sleep(0); printf("线程编号为%d, 全局资源值为%d\n", nThreadNum, g_nNum); //离开各自线程互斥区域 LeaveCriticalSection(&g_csThreadCode); return 0; } int main(int argc, char *argv[]) { HANDLE handle[THREAD_NUM]; int i = 0; printf("--------------------经典线程同步:关键段--------------------\n"); //初始化关键段 InitializeCriticalSection(&g_csThreadParameter); InitializeCriticalSection(&g_csThreadCode); g_nNum = 0; while(i < THREAD_NUM) { //进入子线程关键段区域 EnterCriticalSection(&g_csThreadParameter); handle[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, &i, 0, NULL); ++i; } WaitForMultipleObjects(THREAD_NUM, handle, 1, INFINITE); //删除关键段 DeleteCriticalSection(&g_csThreadCode); DeleteCriticalSection(&g_csThreadParameter); system("pause"); return 0; }
以上代码在Visual Studio 2010中的5次运行结果如下:
如上图所示,该段使用关键段的测试代码的确解决了线程互斥的问题,但是并没有解决线程同步的问题,因此我们需要其他方法,解决线程同步问题。
相关文章推荐
- Windows线程(七)使用互斥量无法解决线程同步问题
- Windows线程(六)使用事件机制解决线程同步问题
- 解决Windows 2008无法创建线程问题
- MapReduce分布式缓存程序,无法在Windows下的Eclipse中执行问题解决
- 终于解决了 Windows 8.1 无法安装WMC的问题
- Windows下解决TerminateThread终止线程导致死锁问题
- 解决VMware在Windows 7上桥接模式下无法上网的问题
- Windows 2003 +iis 6.0 中Silverlight错误,无法下载Silverlight应用程序。请查看Web服务器设置." 问题的解决方法
- 怎么解决安装windows系统无法创建新的分区的问题
- 双系统下删除Linux系统方法和Windows无法启动问题的解决方法
- 【问题解决】windows程序使用LaodImage加载图标无法显示在程序窗口标题栏
- C#技巧【调用线程无法访问此对象,因为另一个线程拥有该对象的问题的解决办法】【C#读写EXCEL源码提示“office检测到此文件存在一个问题。为帮助保护您的计算机,不能打开此文件”的解决】
- 解决安装ubuntu系统后无法回到windows系统的问题
- 关于Windows无法访问指定设备路径或文件,您可能没有合适的权限访问问题解决<转>
- Windows中php7.1无法连接mysql的问题解决
- Windows 64 位 mysql 5.7以上版本包解压中没有data目录和my-default.ini及服务无法启动的快速解决办法(问题小结)
- Windows-驱动-解决Thinkpad e470c在Win8.1下WiFi无法连接的问题
- 解决Windows 8.1中所有的应用(Modern App)无法打开(闪退)的问题
- 解决windows 2003无法下载超过4M的附件的问题
- 解决 Windows 8 无法安装 .NET 组件的问题