在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写了一个多线程的同步的更多相关文章

  1. 用Python写的一个多线程机器人聊天程序

    本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows).后来发现实现起来特别麻烦, 就想到python.听说这家伙在什么地方都能发挥作用.所以想用python来做通讯模块...所 ...

  2. Python标准库08 多线程与同步 (threading包)

    Python主要通过标准库中的threading包来实现多线程.在当今网络时代,每个服务器都会接收到大量的请求.服务器可以利用多线程的方式来处理这些请求,以提高对网络端口的读写效率.Python是一种 ...

  3. python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)

    python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...

  4. NDK中使用pthread多线程中自己写的一个BUG

    在使用pthread进行NDK中的多线程开发时,自己写了一个BUG, void *darkGrayThread(void *args) { ThreadParam *param = (ThreadPa ...

  5. 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1

    package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...

  6. 搞了我一下午竟然是web.config少写了一个点

    Safari手机版居然有个这么愚蠢的bug,浪费了我整个下午,使尽浑身解数,国内国外网站搜索解决方案,每一行代码读了又想想了又读如此不知道多少遍,想破脑袋也想不通到底哪里出了问题,结果竟然是web.c ...

  7. C++实现一个多线程同步方式的协同工作程序示例

    多线程并发程序与协同程序其实是不同的概念.多线程并发是多个执行序同时运行,而协同程序是多个执行序列相互协作,同一时刻只有一个执行序列.今天想到的是将两者结合起来,拿现实生活中的例子来说,假设一个班级有 ...

  8. Javascript写的一个可拖拽排序的列表

    自己常试写了一个可拖拽进行自定义排序的列表,可能写的不太好,欢迎提供意见. 我的思路是将列表中的所有项都放进一个包裹层,将该包裹层设为相对定位,每当点击一个项时,将该项脱离文档并克隆一份重新添加到文档 ...

  9. 測试AtomicInteger与普通int值在多线程下的递增操作

    日期: 2014年6月10日 作者: 铁锚 Java针对多线程下的数值安全计数器设计了一些类,这些类叫做原子类,当中一部分例如以下: java.util.concurrent.atomic.Atomi ...

随机推荐

  1. ANSYS - 修改节点荷载的规则

    问题: 分别在不同的荷载步对同一节点施加集中荷载,则节点最终所受荷载为各步荷载值叠加还是最后一步荷载值? 如,在第一个荷载步对节点n施加集中荷载F1,在第二个荷载步对该节点施加集中荷载F2,则第二个荷 ...

  2. Centos下SFTP双机高可用环境部署记录

    SFTP(SSH File Transfer Protocol),安全文件传送协议.有时也被称作 Secure File Transfer Protocol 或 SFTP.它和SCP的区别是它允许用户 ...

  3. SCRUM 12.19

    我们的爬虫依然存在一些问题,我们决定暂时将大家的工作重心放在爬虫上. 新的任务分配如下 成员 原本任务 新任务 彭林江 落实API 研究美团爬虫 郝倩 研究遍历美团数据方法 研究遍历美团数据方法 牛强 ...

  4. linux内核分析第二四学习报告

    学生  黎静 课程内容 计算机三大法宝 • 存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: • 函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算机来说并不那 ...

  5. 面象对象设计原则之三:里氏替换原则(The Liskov Substitution Principle,LSP)

    里氏代换原则由2008年图灵奖得主.美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing教授于1994年提出.其严格表述如下:如果对每一个类型为S的 ...

  6. RBAC权限控制系统

    1.概述 RBAC(Role-Based Access Control )基于角色的访问控制. RBAC的权限控制可以抽象概括为:判断[Who是否可以对What进行How的访问操作(Operator) ...

  7. [工作相关] GS产品使用LInux下Oracle数据库以及ASM存储时的数据文件路径写法.

    1. 自从公司的GS5版本就已经支持Linux下的oracle数据库通过安装工具自动安装注册了, 只不过路径需要使用linux的命名规则, 如图: /home/oracle/ 注意 最后是有一个 斜线 ...

  8. hive数据查询

    Fetch task 丢弃了mapreduce的作业的繁重任务,查询方便简单 1.第一种方式 2.linux命令行 3.地3中

  9. ubuntu16安装MySQL

    MySQL 是一种开源数据库管理系统,通常作为流行的LAMP(Linux,Apache,MySQL,PHP / Python / Perl)堆栈的一部分安装.它使用关系数据库和SQL(结构化查询语言) ...

  10. BatchNormalization的使用

    # import BatchNormalization from keras.layers.normalization import BatchNormalization # instantiate ...