试着用c写了一个多线程的同步
在Java中写多线程相关的程序简单很多,在多线程中需要同步的时候,使用synchronized就行了。
最近学习c的多线程与同步,感觉实现起来,要写的代码比较多一些,这也许是因为java封装的比较好吧。
下面是今天写的一个例子,主要参考:http://hi.baidu.com/personnel/blog/item/ae87720e8b2f5aea7acbe1c6.html
#include <stdio.h>
#include <windows.h>
#include <process.h> //关键段变量声明
HANDLE g_hThreadEvent;
CRITICAL_SECTION g_csThreadCode; int total = ; //全部变量 unsigned int __stdcall threadFun(void *pm)
{
int v = *(int *)pm; SetEvent(g_hThreadEvent); //触发事件 Sleep(); EnterCriticalSection(&g_csThreadCode); //进入子线程互斥区域 total++; printf("thread no:%d,total:%d\n",v,total); LeaveCriticalSection(&g_csThreadCode); //离开子线程互斥区域 return ;
} int main()
{
//初始化事件和关键段 自动置位,初始无触发的匿名事件
g_hThreadEvent = CreateEvent(NULL, FALSE, FALSE, NULL); //关键段初始化
InitializeCriticalSection(&g_csThreadCode); int i; int THREAD_NUM = ; //子线程数
HANDLE handle[THREAD_NUM];
for(i=;i<THREAD_NUM;i++)
{
handle[i] = _beginthreadex(NULL,,threadFun,&i,,NULL); WaitForSingleObject(g_hThreadEvent, INFINITE); //等待事件被触发,这里必须
} WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE); //用完之后记得销毁
CloseHandle(g_hThreadEvent);
DeleteCriticalSection(&g_csThreadCode); return ;
}
运行结果:

这个例子主要测试两点:
1. 主线程与子线程的同步,使用事件(Event),参考:http://blog.csdn.net/morewindows/article/details/7445233
2. 各子线程间的同步,使用关键段(CRITICAL_SECTION),参考:http://blog.csdn.net/morewindows/article/details/7442639
另注:
实现主线程与子线程的同步,有几种方式:事件(Event)、信号量(Semaphore)。
实现子线程的同步,有几种方式,比如:关键段(CRITICAL_SECTION),互斥量(Mutex)。
关于子线程间的两种同步方式的对比,参见:http://hi.baidu.com/personnel/blog/item/fd4a7609ffba398f2fddd436.html
2012-05-13
试着用c写了一个多线程的同步的更多相关文章
- 用Python写的一个多线程机器人聊天程序
本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows).后来发现实现起来特别麻烦, 就想到python.听说这家伙在什么地方都能发挥作用.所以想用python来做通讯模块...所 ...
- Python标准库08 多线程与同步 (threading包)
Python主要通过标准库中的threading包来实现多线程.在当今网络时代,每个服务器都会接收到大量的请求.服务器可以利用多线程的方式来处理这些请求,以提高对网络端口的读写效率.Python是一种 ...
- python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)
python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...
- NDK中使用pthread多线程中自己写的一个BUG
在使用pthread进行NDK中的多线程开发时,自己写了一个BUG, void *darkGrayThread(void *args) { ThreadParam *param = (ThreadPa ...
- 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...
- 搞了我一下午竟然是web.config少写了一个点
Safari手机版居然有个这么愚蠢的bug,浪费了我整个下午,使尽浑身解数,国内国外网站搜索解决方案,每一行代码读了又想想了又读如此不知道多少遍,想破脑袋也想不通到底哪里出了问题,结果竟然是web.c ...
- C++实现一个多线程同步方式的协同工作程序示例
多线程并发程序与协同程序其实是不同的概念.多线程并发是多个执行序同时运行,而协同程序是多个执行序列相互协作,同一时刻只有一个执行序列.今天想到的是将两者结合起来,拿现实生活中的例子来说,假设一个班级有 ...
- Javascript写的一个可拖拽排序的列表
自己常试写了一个可拖拽进行自定义排序的列表,可能写的不太好,欢迎提供意见. 我的思路是将列表中的所有项都放进一个包裹层,将该包裹层设为相对定位,每当点击一个项时,将该项脱离文档并克隆一份重新添加到文档 ...
- 測试AtomicInteger与普通int值在多线程下的递增操作
日期: 2014年6月10日 作者: 铁锚 Java针对多线程下的数值安全计数器设计了一些类,这些类叫做原子类,当中一部分例如以下: java.util.concurrent.atomic.Atomi ...
随机推荐
- SCRUM 12.22
周一,大家现在课程也比较少,今天都在非常努力地写代码. 任务分配如往常一样,我们现在基本将工作的重心放在完善已有的组件上. 成员 任务 彭林江 落实API 牛强 落实意见反馈功能测试 高雅智 测试已完 ...
- Junit4使用实验报告
一.题目简介 Junit4的使用及求和测试. 二.源码的github链接 https://github.com/bjing123/test-/blob/master/Arithmetic.txt ht ...
- IT行业创新的读后感
一.什么是创新 创新是以新思维.新发明和新描述为特征的一种概念化过程.它原意有三层含义,第一,更新:第二,创造新的东西:第三,改变.创新是人类特有的认识能力和实践能力,是人类主观能动性的高级表现形式, ...
- vue props 用法(转载)
前面的话 组件接受的选项大部分与Vue实例一样,而选项props是组件中非常重要的一个选项.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过 props ...
- JavaScript 作用域链与闭包
作用域链 在某个作用域访问某个变量或者函数时,会首先在自己的局部环境作用域中搜寻变量或者函数,如果本地局部环境作用域中有该变量或者函数,则就直接使用找到的这个变量值或者函数:如果本地局部环境作用域中没 ...
- Java基础实践一:for关键字的实现原理
Java源码: /** * Demo.java * com.yuanchuangyun.libra.web * * * ver date author * ────────────────────── ...
- [转帖]GitHub上整理的一些工具
GitHub上整理的一些工具 技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 inf ...
- 如何根据元素的className获取元素?
getElementsByClassName()是HTML5 新增的DOM API.IE8以下不支持 我们知道,原生的方法,是getElementById()和getElementsByTagName ...
- 软件工程_8th weeks
第八周PSP 个人时间管理 由于本周主要在做论文实验,除了学习时间外有一些零散的时间也在思考代码的书写以及论文实验的流程,但是这些零散的时间并没有在总的表记录,所以想问一下老师,像这种平时零散思考的时 ...
- hive-site.xml
https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin#AdminManualMetastoreAdmi ...