多线程编程——临界区
2016-07-26 23:42
706 查看
1、windows API创建线程
2、使用临界区的多线程编程 windows API
3、使用临界区的多线程编程 MFC类
#include <windows.h> //包含相应头文件 #include <stdio.h> DWORD WINAPI myfun1(LPVOID lpParameter ); //声明线程函数 DWORD WINAPI myfun2(LPVOID lpParameter ); int main() //主函数 { HANDLE h1,h2; //定义句柄变量 h1=::CreateThread(NULL,0,myfun1,NULL,0,NULL); //创建线程1 printf("线程1开始运行!\r\n"); //输出线程1运行信息 h2=::CreateThread(NULL,0,myfun2,NULL,0,NULL); //创建线程2 printf("线程2开始运行!\r\n"); //输出线程2运行信息 ::CloseHandle(h1); //关闭线程句柄对象 ::CloseHandle(h2); while(1) { if(getchar()=='q') //如果用户输入字符q { return 0; //程序正常退出 } else //如果用户输入的字符不是q { ::Sleep(100); //程序睡眠 } } } DWORD WINAPI myfun1(LPVOID lpParameter) //分别实现线程函数 { printf("线程1正在运行!\r\n"); //输出信息 return 0; //正常结束线程函数 } DWORD WINAPI myfun2(LPVOID lpParameter) { printf("线程2正在运行!\r\n"); return 0; }
2、使用临界区的多线程编程 windows API
#include <windows.h> //包含头文件 #include <stdio.h> DWORD WINAPI myfun1(LPVOID lpParameter );//声明线程函数 DWORD WINAPI myfun2(LPVOID lpParameter ); static int a1=0; //定义全局变量并初始化 CRITICAL_SECTION Section; //定义临界区对象 int main() //主函数 { InitializeCriticalSection(&Section); //初始化临界区对象 HANDLE h1,h2; //定义线程句柄 h1=::CreateThread(NULL,0,myfun1,NULL,0,NULL); //创建线程1 printf("线程1开始运行!\r\n"); h2=::CreateThread(NULL,0,myfun2,NULL,0,NULL); //创建线程2 printf("线程2开始运行!\r\n"); ::CloseHandle(h1); //关闭线程句柄对象 ::CloseHandle(h2); ::Sleep(10000); //程序睡眠10秒 printf("正常退出程序请按\r\n"); while(1) { if(getchar()=='q') //如果用户输入字符q { DeleteCriticalSection(&Section); //删除临界区对象 return 0; } } } DWORD WINAPI myfun1(LPVOID lpParameter) //线程函数1 { while(1) { EnterCriticalSection(&Section); //进入临界区 a1++; //变量自加 if(a1<10000) //设置变量a1小于10000 { //::Sleep(1000); //程序睡眠1秒 printf("线程1正在计数%d\r\n",a1); LeaveCriticalSection(&Section); //离开临界区 } else //如果变量大于10000 { LeaveCriticalSection(&Section); //离开临界区 break; //跳出循环 } } return 0; } DWORD WINAPI myfun2(LPVOID lpParameter) //线程函数2 { while(1) { EnterCriticalSection(&Section); //进入临界区 a1++; if(a1<10000) { //::Sleep(1000); //程序睡眠1秒 printf("线程2正在计数%d\r\n",a1); LeaveCriticalSection(&Section); //离开临界区 } else { LeaveCriticalSection(&Section); break; } } return 0; //线程函数返回0 }
3、使用临界区的多线程编程 MFC类
#include <stdio.h> #include <afxmt.h> DWORD WINAPI myfun1(LPVOID lpParameter); //声明线程函数 DWORD WINAPI myfun2(LPVOID lpParameter); CCriticalSection m_Sec; //定义全局变量m_Sec int a=0; //定义全局变量a int main() { HANDLE h1,h2; //定义线程句柄 h1=::CreateThread(NULL,0,myfun1,NULL,0,NULL); //创建线程1 printf("线程1开始运行!\r\n"); h2=::CreateThread(NULL,0,myfun2,NULL,0,NULL); //创建线程2 printf("线程2开始运行!\r\n"); ::CloseHandle(h1); //关闭线程句柄对象 ::CloseHandle(h2); ::Sleep(10000); //程序睡眠10秒 return 0; } DWORD WINAPI myfun1(LPVOID lpParameter) //线程函数1 { m_Sec.Lock(); //锁定临界区 a+=1; //变量加1 printf("%d\n",a); //输出变量 m_Sec.Unlock(); //对临界区进行解锁 return 0; } DWORD WINAPI myfun2(LPVOID lpParameter) //线程函数2 { m_Sec.Lock(); //锁定临界区 a+=1; //变量加1 printf("%d\n",a); //输出变量 m_Sec.Unlock(); //对临界区进行解锁 return 0; }
相关文章推荐
- Android Manifest 用法
- Python3写爬虫(四)多线程实现数据爬取
- 什么是 GraphQL?
- Spark RDD API详解(一) Map和Reduce
- 如何重装TCP/IP协议
- Spring Boot 开发微服务
- Windows 8 官方高清壁纸欣赏与下载
- 谁是桌面王者?Win PK Linux三大镇山之宝
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- Windows Clang开发环境备忘
- 从Windows系统下访问Linux分区相关软件
- 肯特·贝克:改变人生的代码整理魔法
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- Windows下搭建本地SVN服务器
- 你应该学习哪种编程语言?
- lwn拾遗:[sn3218 led drivers]-api解释-1
- 使用Windows原生命令一键清空剪贴板
- 页面元素查找之Selectors API