MSDN -- Synchronization Functions

1. 使用临界区对象(CRITICAL_SECTION)

创建线程 unsigned long _beginthreadex(void *security , unsigned stack_size,

Unsigned(_stdcall *start_address)(void *),void *arglist, unsigned initflag,

Unsigned *thraaddr)

结束线程 void _endthreadex(unsigned retval);

初始化临界区 InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

进入临界区 EnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection);

离开临界区 void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

删除临界区 void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

#include <windows.h>

#include <stdio.h>

#include <process.h>

BOOL g_bContinue = TRUE;

int g_nCount1 = 0;

int g_nCount2 = 0;

CRITICAL_SECTION g_cs;

UINT WINAPI ThreadProc(LPVOID lpParam){

while (g_bContinue)

{

EnterCriticalSection(&g_cs);

g_nCount1++;

g_nCount2 ++;

LeaveCriticalSection(&g_cs);

}

return 0;

}

int main(int argc,char *argv[]){

UINT uId;

HANDLE hThreads[2];

//初始化临界区

InitializeCriticalSection(&g_cs);

hThreads[0] = (HANDLE)_beginthreadex(NULL,0,ThreadProc,NULL,0,&uId);

hThreads[1] = (HANDLE)_beginthreadex(NULL,0,ThreadProc,NULL,0,&uId);

Sleep(1000);

g_bContinue = FALSE;

WaitForMultipleObjects(2,hThreads,TRUE,INFINITE);

CloseHandle(hThreads[0]);

CloseHandle(hThreads[1]);

DeleteCriticalSection(&g_cs);

printf("g_nCount1=%d\tg_nCount2=%d\n",g_nCount1,g_nCount2);

return 0;

}

2. 互锁函数

InterlockedIncrement InterlockedDecrement InterlockedExchangAdd InterlockedExchangePointer

函数同步增一、减一

LONG InterlockedIncrement(LONG volatile *Addend);

LongInterlockedDecrement(LONG volatile *Addend);

转载于:https://www.cnblogs.com/cody1988/archive/2011/09/04/2166679.html

windows编程点滴(四)之线程的同步相关推荐

  1. linux网络编程(四)线程池

    linux网络编程(四)线程池 为什么会有线程池? 实现简单的线程池 为什么会有线程池? 大多数的服务器可能都有这样一种情况,就是会在单位时间内接收到大量客户端请求,我们可以采取接受到客户端请求创建一 ...

  2. Windows编程 第四回 Windows程序的生与死(下)

    致歉 很抱歉,读者看到的这篇文章将是我写的最没什么条理的一篇了,由于这一块儿内容是所有Windows程序的核心与基础,所以我分了三回来写.我想讲 得既易懂有又丰富,无奈本人才疏学浅,每每一提笔就要查很 ...

  3. java 活锁 线程饿死,JAVA并发编程(四)线程死锁、饥饿、活锁

    JAVA并发编程(四)线程死锁 线程死锁 什么是线程死锁呢? 为什么会线程死锁呢? 如何避免线程死锁? 什么是饥饿呢? 什么是活锁呢? 线程死锁 什么是线程死锁呢? 死锁是指两个或两个以上的线程在执行 ...

  4. 嵌入式Linux系统编程学习之三十线程的同步

    文章目录 一.条件变量 1.创建和注销 2.等待和激发 3.其他 二.信号灯 1.创建和注销 2.点灯和灭灯 3.获取灯值 4.其他 一.条件变量   条件变量是利用线程间共享的全局变量进行同步的一种 ...

  5. windows编程点滴(一)之Windows获取系统中所有进程

    Tool help function     PSAPI functions (PROCECC STATUS) 1.结构体PROCESSENTRY32 typedef struct tagPROCES ...

  6. Windows核心编程 第八章 用户方式中线程的同步(下)

    8.4 关键代码段 关键代码段是指一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权.这是让若干行代码能够"以原子操作方式"来使用资源的一种方法.所谓原子操作方式,是 ...

  7. Windows核心编程 第八章 用户方式中线程的同步(上)

    第8章 用户方式中线程的同步 当所有的线程在互相之间不需要进行通信的情况下就能够顺利地运行时, M i c r o s o f t Wi n d o w s的运行性能最好.但是,线程很少能够在所有的时 ...

  8. 用户方式中线程的同步——Windows核心编程学习手札之八

    用户方式中线程的同步 --Windows核心编程学习手札之八 系统中所有线程都必须拥有对各种系统资源的访问权,这些资源包括内存堆栈.串口.文件.窗口和许多其他资源.如果一个线程需要独占对资源的访问权, ...

  9. Windows编程-- 用户方式中线程的同步---关键代码段(临界区)

    可以从例子学习,更好的掌握 #include <windows.h> #include <iostream.h> //两个线程的声明 DWORD WINAPI Fun1Proc ...

最新文章

  1. Java中常用的类及其特点
  2. mysql 嵌入式 c开发环境_【Linux】嵌入式C语言MySQL编程(libmysqlclient-dev使用)
  3. CentOS中使用Dockerfile部署带websocket的SpringBoot的jar包
  4. 鸿蒙so系统,鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)
  5. ubuntu ip设置
  6. WeakHashMap理解
  7. 分段式多级离心泵_分段式多级离心泵工作原理
  8. C++空类中的默认函数
  9. Linux命令解释之rm
  10. 2021年年度最优质开源软件
  11. 图书信息管理系统需求分析
  12. Hspice 反相器仿真
  13. 计算机输入输出方式的应用,[原创]计算机组成原理之输入输出系统题目及解答...
  14. YALMIP建模+CPLEX求解,让优化问题更简单
  15. 漫谈程序员系列:看看你离优秀有多远
  16. 如何开发app软件?程序员揭秘你还没听过的1种方法
  17. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java在线电影院售票系统5u8st
  18. maven镜像源及代理配置
  19. Scratch入门教程:第二节 简单的交互
  20. MySQL专题四——MySQL函数(聚合函数)

热门文章

  1. unity 编辑器扩展 扩展摄像机的属性查看器
  2. python中对列表浅复制深复制另类的理解方式
  3. HDU-5783 Divide the Sequence(贪心)
  4. PHPcms 把盛大登陆换成人人网登陆
  5. android中多线程绘制曲线图实例
  6. C#String.Split (string[], StringSplitOptions) 多参数分割得到数组
  7. html5创建对象的方法,JavaScript面向对象-使用工厂方法和构造函数方法创建对象...
  8. python和rpa有什么关系_什么是RPA_什么是RPA_产品简介_机器人流程自动化RPA - 阿里云...
  9. influxdb tsm文件_Influxdb中的Compaction操作
  10. html页面获取关闭页面事件,html页面关闭事件