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"谢谢-- 为何要使用同步? ...
随机推荐
- Yaf自定义autoload以实现Model文件和Controller文件命名区分
先上图: 由于Yaf作者在设计Yaf框架目录时没有直接区分开models文件和controllers文件,所以在IDE看着会很难受,眼睛离开了编辑器就不大好区分这两个文件夹的文件.所以自己写了一个au ...
- (转)一致性Hash
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...
- javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
这个错误的原因是没有项目使用到了Tomcat中配置的数据源(但是你本地没有配置),关于什么是JNDI看这篇文章就够了® 今天导入一个项目(比较老的),在本地运行时报错: Cannot resolve ...
- 在Unity5中使用C#脚本实现UI的下滑、变色、渐隐渐现效果
一.首先,我们先创建一个Text 依次选择Component→UI→Text创建一个Text,创建完成后如下: 二.创建完成后,在Project面板点击Create→C# Script,本例命名 ...
- Docker(一)概念与基础
Docker 基础 为什么需要docker?在传统部署下,我们会遇到不同机器.不同依赖版本的兼容性等问题,解决此问题一般会消耗大量时间,并且在不同机器上均要执行统一环境的部署也是一个耗时较长的工作.除 ...
- PP: Reconstructing time series into a complex network to assess the evolution dynamics of the correlations among energy prices
Purpose detect the dynamics in time series of their correlation Methodology 1. calculate correlation ...
- 创建pod失败分析
- JS 获取当天所在月的第一天的日期,最后一天日期,所在周的每天的日期,时间,所在每月日期,时间的计算
/** * 获取当天所在月的最后一天日期,和下一个月的第一天日期 * 调用getMonthDay(d), d默认值为01,d为要设置成的day: */ const getMonthMaxDay = ( ...
- 【Unity|C#】基础篇(0)——C#与.NET框架
[学习资料] <C#图解教程>(第1章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu.c ...
- MYSQL之路之表