解决linux下WaitForMultipleObjects的一种方法

原文地址: http://hymike.net/blog/?p=138


借助了linux下的Semaphore(信号量),实现了一种简单的WaitForMultipleObjects。
关于Semaphore参考如下的文章:

http://blog.163.com/wulin_shenghua/blog/static/27580770200952644311771/

具体思想:多个线程共享一个信号量,子线程结束后让信号量+1,主线程做n次信号量-1的操作(为0的时候会自动等待),等到做完n次-1,说明n个子线程都完成了+1,说明全部子线程都执行完了,就可以继续了。
这只是WaitForMultipleObjects的一种简单替代,因为没有返回值,所以不能判断某个线程出问题与否。

#include <pthread.h>
#include <semaphore.h>
#include <iostream>
#include <stdio.h>
using namespace std;

typedef struct pinfo
{
    sem_t * bin_sem;
    int id;
}pinfo;

void *thread_function(void *arg)
{
    pinfo *t=(pinfo*)arg;
    printf("thread_functiont%dt--------------sem_waitn",t->id);
    int ii=t->id + 1;
    sleep(ii);    //暂停一会,这里模拟程序执行
    sem_post(t->bin_sem);    //信号量+1
    printf("sem_donet%dn",t->id);
    return NULL;
}

int main()
{
    int res;
    int n=10;    //设置个线程
    sem_t  bin_sem;    //设置信号量,下面初始化这个信号量

    res = sem_init(&bin_sem, 00);
 
    if (res != 0)
    {
        perror("Semaphore initialization failed");
    }
    printf("sem_initn");
    int i;
    pinfo *p=new pinfo[n];    //创建个线程的参数结构体
    pthread_t *a_thread=new pthread_t[n];
    for(i=0;i<n;i++)
    {
        printf("entering %dn",i);
        p[i].bin_sem=&bin_sem;    //让参数中间的信号量指向main中的信号量(共用一个信号量)
        p[i].id=i+1;
        printf("init OK %dn",i);
        res = pthread_create(&a_thread[i]NULL, thread_function, &p[i]);    //创建线程
        if (res != 0)
        {
            printf("Thread creation failure");
        }
    }
    printf("thread_function_mainn");
    for(i=0;i<n;i++)
    {
        sem_wait(&bin_sem);    //循环等待次,相当于个线程都执行完了
    }
    printf("thread_main_exitn");
    sem_destroy(&bin_sem);        //释放信号量
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值