原文地址: 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, 0, 0);
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;
}