windows线程同步的几种方式
以下为main函数的测试代码 具体线程同步的实现代码请下载:https://github.com/kingsunc/ThreadSynchro
#include <stdio.h>
#include <process.h>
#include "MyObject.h"
#include "MyCriticalSection.h"
#include "MyInterLock.h"
#include "MyRWLock.h"
#include "MySemaphore.h"
#include "MyMutex.h"
#include "MyEvent.h" #define MY_NOSYNCHRO_TEST // 不进行线程同步; // 用户态-同步方式;
//#define MY_INTERLOCK_TEST // 原子操作;
//#define MY_CRITICALSECTION_TEST // 临界区;
//#define MY_SRWLOCK_TEST // 读写锁; // 内核态-同步方式;
//#define MY_SEMAPHORE_TEST // 信号量;
//#define MY_MUTEX_TEST // 互斥量;
//#define MY_EVENT_TEST // 事件; long g_lCount = ; #define THREAD_COUNT 10 // 线程数;
#define ACCESS_TIMES 100000 // 访问共享变量的次数,增大其值,增加数据竞争发生的可能性; #ifdef MY_NOSYNCHRO_TEST
CMyObject g_myLock;
#endif #ifdef MY_CRITICALSECTION_TEST
CMyCriticalSection g_myLock;
#endif #ifdef MY_SRWLOCK_TEST
CMyRWLock g_myLock;
#endif #ifdef MY_SEMAPHORE_TEST
CMySemaphore g_myLock;
#endif #ifdef MY_MUTEX_TEST
CMyMutex g_myLock;
#endif #ifdef MY_EVENT_TEST
CMyEvent g_myLock;
#endif void __cdecl ThreadProc(void* para)
{
printf("sub thread started\n");
for (int i = ; i < ACCESS_TIMES; i++)
{
#ifdef MY_INTERLOCK_TEST
CMyInterLock::Increment(&g_lCount);
#else
g_myLock.Lock();
++g_lCount;
g_myLock.UnLock();
#endif
} printf("sub thread finished\n");
_endthread(); // 可以省略,隐含会调用;
} // 测试函数;
void Thread_Test()
{
HANDLE hThread[THREAD_COUNT];
for (int i = ; i < THREAD_COUNT; i++)
{
hThread[i] = (HANDLE)_beginthread(ThreadProc, , NULL);
} for (int i = ; i < THREAD_COUNT; i++)
{
WaitForSingleObject(hThread[i], INFINITE);
} // 检查结果;
printf("g_lCount: %d\n", g_lCount);
if (g_lCount == ACCESS_TIMES*THREAD_COUNT)
{
printf("Correct Result!\n");
}
else
{
printf("Error Result!\n");
}
} int main()
{
Thread_Test(); system("pause");
}
windows线程同步的几种方式的更多相关文章
- IOS 多线程,线程同步的三种方式
本文主要是讲述 IOS 多线程,线程同步的三种方式,更多IOS技术知识,请登陆疯狂软件教育官网. 一般情况下我们使用线程,在多个线程共同访问同一块资源.为保护线程资源的安全和线程访问的正确性. 在IO ...
- Java线程同步的四种方式详解(建议收藏)
Java线程同步属于Java多线程与并发编程的核心点,需要重点掌握,下面我就来详解Java线程同步的4种主要的实现方式@mikechen 目录 什么是线程同步 线程同步的几种方式 1.使用sync ...
- C++线程同步的四种方式(Windows)
为什么要进行线程同步? 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作.更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解.正常情况下对这种处理结果的 ...
- C++实现线程同步的几种方式
线程同步是指同一进程中的多个线程互相协调工作从而达到一致性.之所以需要线程同步,是因为多个线程同时对一个数据对象进行修改操作时,可能会对数据造成破坏,下面是多个线程同时修改同一数据造成破坏的例子: # ...
- C++ 线程同步的四种方式
程之间通信的两个基本问题是互斥和同步. (1)线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒. (2)线程互 ...
- 关于windows线程同步的四种方法
#include "stdafx.h" #include "iostream" #include "list" #include " ...
- Linux学习笔记21——线程同步的两种方式
一 用信号量同步 1 信号量函数的名字都以sem_开头,线程中使用的基本信号量函数有4个 2 创建信号量 #include<semaphore.h> int sem_init(sem_t ...
- 【Linux】多线程同步的四种方式
背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通过多线程模拟多窗口售票为例: #include <iostream> #include<pthread.h> ...
- java笔记--关于线程同步(7种同步方式)
关于线程同步(7种方式) --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3897440.html"谢谢-- 为何要使用同步? ...
随机推荐
- 最近公共祖先 Lowest Common Ancestors
基于深度的LCA算法: 对于两个结点u.v,它们的深度分别为depth(u).depth(v),对于其公共祖先w,深度为depth(w),u需要向上回溯depth(u)-depth(w)步,v需要d ...
- nice-validator判断表单是否验证通过
$("#formSurvery").isValid(function(is){ if(is){ alert("通过!") } } 如果is为false则表示不通 ...
- 三、linux环境的搭建1(oracle、ssh、jdk、mysql、samba、tomcat)
linux环境的搭建1(oracle.ssh.jdk.mysql.samba.tomcat) 网络配置 方案一 tip 1 使用ifconfig : ifconfig eth0 新ip 然后编辑/ ...
- R data formats
R data formats: Rdata Rda Rds 1.概念 rds是R语言中利用二进制保存的源文件,加载readr包以后,使用write_rds(x,file='x.rds')保存文件,re ...
- 环境配置 | mac环境变量文件.bash_profile相关
每次环境配置都费老劲,零零碎碎的知识就记在这里 文件:~/.bash_profile
- Centos7在防火墙中添加访问端口
1. 查看jenkins启动状态命令:systemctl status Jenkins 保证jenkins启动,此处的状态为正在运行 2. 查看防火墙状态命令:systemct ...
- [UOJ228] 基础数据结构练习题 - 线段树
考虑到一个数开根号 \(loglog\) 次后就会变成1,设某个Node的势能为 \(loglog(maxv-minv)\) ,那么一次根号操作会使得势能下降 \(1\) ,一次加操作最多增加 \(l ...
- NW.js桌面应用开发(一)
NWjs中文网 Electron中文网 一些需要了解的历史与特性,其实就是 NW.js 和 Electron的争议,建议还是亲自阅读一下各自的官网说明 1.下载SDK版工具 从淘宝NPM镜像下载,速度 ...
- VSFTPD服务器
我虽然vsftpd服务器做了百遍以上,但是我觉的成功率不大.我要写下这篇日记,来让我分析自己曾经的过错!! vsftpd的原理我不多讲!!!请自行百度吧!! 我搭建的环境是 Linux6.4 IP(1 ...
- Python生成通用唯一识别码UUID
from uuid import uuid4 for i in range(100): uid = str(uuid4()) suid = ''.join(uid.split('-')) print( ...