码迷,mamicode.com
首页 > 编程语言 > 详细

试着用c写了一个多线程的同步

时间:2015-06-17 15:20:21      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:

在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

试着用c写了一个多线程的同步

标签:

原文地址:http://www.cnblogs.com/personnel/p/4583245.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!