试着用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 = 0; //全部变量

unsigned int __stdcall threadFun(void *pm)
{
    int v = *(int *)pm;

    SetEvent(g_hThreadEvent); //触发事件

    Sleep(50);

    EnterCriticalSection(&g_csThreadCode); //进入子线程互斥区域

    total++;

    printf("thread no:%d,total:%d\n",v,total);

    LeaveCriticalSection(&g_csThreadCode); //离开子线程互斥区域

    return 0;
}

int main()
{
    //初始化事件和关键段 自动置位,初始无触发的匿名事件
    g_hThreadEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

    //关键段初始化
    InitializeCriticalSection(&g_csThreadCode);

    int i;

    int THREAD_NUM = 10; //子线程数
    HANDLE handle[THREAD_NUM];
    for(i=0;i<THREAD_NUM;i++)
    {
        handle[i] = _beginthreadex(NULL,0,threadFun,&i,0,NULL);

        WaitForSingleObject(g_hThreadEvent, INFINITE); //等待事件被触发,这里必须
    }

     WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);

     //用完之后记得销毁
     CloseHandle(g_hThreadEvent);
     DeleteCriticalSection(&g_csThreadCode);

    return 0;
}

运行结果:

这个例子主要测试两点:

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

时间: 2024-10-12 13:21:16

试着用c写了一个多线程的同步的相关文章

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

Python主要通过标准库中的threading包来实现多线程.在当今网络时代,每个服务器都会接收到大量的请求.服务器可以利用多线程的方式来处理这些请求,以提高对网络端口的读写效率.Python是一种网络服务器的后台工作语言 (比如豆瓣网),所以多线程也就很自然被Python语言支持. (关于多线程的原理和C实现方法,请参考我之前写的Linux多线程与同步,要了解race condition, mutex和condition variable的概念) 多线程售票以及同步 我们使用Python来实

swift __1 试写第一个swift程序

参照:http://swiftist.org/topics/96?page=2#comments 发现有几个地方一直报错,自己修改了下,有可能是xcode6更新导致 代码写的比较乱,这是我的硬伤,这次注释还是后面加上的,这也是我的硬伤,需要改.养成良好的代码习惯. 下面贴上自己的代码 // // ViewController.swift // SwiftCounter // // Created by 三十一 on 14-8-20. // Copyright (c) 2014年 yetuoxun

《Effective C 》资源管理:条款25--考虑写出一个不抛出异常的swap函数

条款25考虑写出一个不抛出异常的swap函数 条款25:考虑写出一个不抛出异常的swap函数 swap是STL中的标准函数,用于交换两个对象的数值.后来swap成为异常安全编程(exception-safe programming,条款29)的脊柱,也是实现自我赋值(条款11)的一个常见机制.swap的实现如下: namespace std{ template<typename T> void swap(T& a, T& b) { T temp(a); a=b; b=temp;

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

多线程并发程序与协同程序其实是不同的概念.多线程并发是多个执行序同时运行,而协同程序是多个执行序列相互协作,同一时刻只有一个执行序列.今天想到的是将两者结合起来,拿现实生活中的例子来说,假设一个班级有100个学生,一个老师要批改100个学生的作业,有时老师太忙或者赶时间会叫几个同学帮忙批改,等所有同学都批改完后都交到老师手中,老师在下次上课的时候将作业本一起发给班上的学生....其实在并发编程的时候也可以借鉴这一个思想和模式,特别是网络服务器开发的过程中,并发与协同经常出现,于是今天写了一个简单

如何正确地写好一个界面

写界面可以说是每位移动应用开发者的基本功,也是一位合格移动应用开发者绕不过去的坎.但就如不是每一位开发者都能够成为合格的开发者一样,本人在 不同的团队中发现,甚少有人能够编写出合格的UI代码:而非常奇怪的是,在很多的开发者论坛上看到我们移动开发者更多关注于某个控件或者是动画,但却很少 看到深入剖析UI机制,指导UI开发的文章. 由于界面涉及到的方面实在过于广泛,本文不可能事无巨细,一一道来,所以本文先立足于点,深入剖析iOS UI系统中不被重视却非常重要的机制,帮助本文读者对iOS的UI系统有整

一个多线程问题引发的血案-(代码段执行完毕,子进程未执行完毕导致段错误)

今天遇到一个问题,gdb执行程序完全没有问题,但直接执行就会段错误,百思不得其解,各种纠结,各种搜索引擎都试了一遍,无果!后来问题还是被我自己挖出来了. 看下边一段代码: int TaskSendControl() { pthread_t prov_thread[CLIENT_NUM]; int prov[CLIENT_NUM]; for(int i=0; i< CLIENT_NUM; i++) { prov[i] = i; if( pthread_create(&prov_thread[i

自己写的一个简单的迅雷下载支持断点续传

当我学习了网络线程,就自己仿照迅雷下载写了一个下载器,支持断点续传 我用的是SWT插件做的界面 界面 package com.yc.xunlei; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.Arra

写了一个预约东南大学体育场馆的python脚本,目前刚刚实现功能,后续会继续完善

看到git上有人写了一个自动预约的脚本,正好前段时间在学python爬虫和脚本,索性也写了一个,大佬直接略过. 目前没有做图形化,账号和预约信息也是手动输入的,我也只写了羽毛球和乒乓球,其实就是一个属性的值.嫌麻烦的同学可以写一个文本文件,保存这些信息,然后倒入到脚本里,每次稍作修改就可以了.如果基友固定的话,也可以写死在脚本里. 本篇博客只说下博主写脚本的时候遇到的问题和心路历程,只是想要代码的可以直接忽略下文,代码已经上传github:https://github.com/CooperXxx

利用闲暇之余写了一个股票信息发送到微信的软件

利用闲暇之余写了一个股票信息发送到微信的软件, 有做股票的程序员可以试一下. 如何 将通达信的预警股票发送到微信 有新方法了. 股讯二代 更加简便,更加稳定. 先看效果: 安装只要三步 : 1.配置账号 2.设置通达信预警 3.启动程序 安装视频(只需要三分钟): 安装指南 下载地址 原文地址:https://www.cnblogs.com/xiaoxuebiye/p/10400334.html