Windows提高_2.2第二部分:用户区同步
发布时间:2020-12-14 01:37:37 所属栏目:Windows 来源:网络整理
导读:第二部分:用户区同步 同步和互斥 同步:就是按照一定的顺序执行不同的线程 互斥:当一个线程访问某一资源的时候,其它线程不能同时访问 多线程产生的问题 #include stdio.h #include windows.h ? // 全局变量,被不同的线程访问和修改 int g_Number = 0 ;?D
第二部分:用户区同步
多线程产生的问题#include <stdio.h> #include <windows.h> ? // 全局变量,被不同的线程访问和修改 int g_Number = 0; ? DWORD WINAPI ThreadPro1(LPVOID lpThreadParameter) { // 为 g_Number 自增 100000 次 for (int i = 0; i < 100000; i++) g_Number++; return 0; } DWORD WINAPI ThreadPro2(LPVOID lpThreadParameter) { // 为 g_Number 自增 100000 次 for (int i = 0; i < 100000; i++) g_Number++; return 0; } int main() { // 创建两个线程 HANDLE hThread1 = CreateThread(NULL,NULL,ThreadPro1,NULL); HANDLE hThread2 = CreateThread(NULL,ThreadPro2,NULL); ? // 等待两个线程执行结束 WaitForSingleObject(hThread1,-1); WaitForSingleObject(hThread2,-1); ? // 输出修改后的全局变量 printf("%d",g_Number); ? return 0; } ? 产生问题的原因mov ? ? ? ? eax,dword ptr[Number]
mov ? ? ? ? eax,dword ptr[Number] ? [0]: Number(0) ?eax(0)
原子操作(Interlocked...)
for (int i = 0; i < 100000; i++) { // 使用原子操作函数,将自增操作变为不可分割的一条指令 InterlockedIncrement(&g_Number); ? // 以上语句会被翻译成下列单条汇编指令 // lock inc dword ptr [g_Number] } ? 临界区(CriticalSection)
// 1. 创建一个临界区(关键段)结构体 CRITICAL_SECTION CriticalSection = { 0 }; ? // 2. 在 【main】 函数中对创建的临界区进行初始化操作 // InitializeCriticalSection(&CriticalSection); ? DWORD WINAPI ThreadPro1(LPVOID lpThreadParameter) { // 为 g_Number 自增 100000 次 for (int i = 0; i < 100000; i++) { // 当有一个线程正在执行代码的时候 ? // 同一个线程每进入一次受保护的区域,RecursionCount +1 // OwningThread 当前被哪一个线程所有 ? // 3. 使用 EnterCriticalSection 标识需要保护的代码的起始位置 EnterCriticalSection(&CriticalSection); g_Number++; // 4. 使用 LeaveCriticalSection 标识需要保护的代码的结束位置 LeaveCriticalSection(&CriticalSection); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Windows – Node.js 0.5.x的递归目录创建
- windows10 下使用visual studio2015 编译MySQL5.7.22
- 04内核-驱动对象
- r – 在windows上安装gputools
- windows-7 – 在关闭程序之前在Windows 7关闭时运行批处理文
- active-directory – 有没有办法将AD用户与Office 365同步但
- 如何进入IIS管理控制台?
- 实体框架–MVC 6中缺少microsoft.data.entity(Visual Studi
- windows – GVim:在新标签页中打开
- windows-server-2003 – Windows Server 2003 – 授予用户完