Linux POSIX线程实现wait_group功能

来源:互联网 发布:传奇世界怪物数据库 编辑:程序博客网 时间:2024/05/29 18:35

Linux POSIX线程实现wait_group功能

wait_group:

用一个数据结构实现让主线程等待一组线程执行结束之后在退出的功能。

方法:

方法一:

主线程调用pthread_exit((void *)2);
原因:

  • pthread_exit在main中有只终止main线程,而不终止整个进程的作用(注意不存在父子线程的概念)
  • 在main线程终止时如果调用了pthread_exit(),那么此时终止的只是main线程,而进程的资源会为其他由main线程创建的线程保持打开的状态,直到其他线程都终止。而在其他的由main线程创建的线程中pthread_exit并没有这种作用。

方法二:

主线程对于各个线程调用pthread_join()

pthread_join(t3,NULL);pthread_join(t2,NULL);pthread_join(t1,NULL);

注意:即使t1比t2和t3先退出也没有关系

方法三:

模拟golang中的wait_group功能,利用条件变量实现相同功能。

#include <cstdlib>#include <iostream>#include <string>#include <algorithm> #include <pthread.h>#include <sys/time.h>#include <unistd.h>using namespace std;struct wait_group {    /*要等待退出的线程数*/    int count;    /*保证存取操作的原子性 互斥性*/    pthread_mutex_t locker;    /*是否组内线程都完成了*/    pthread_cond_t all_done;    wait_group(int val) : count(val) {        pthread_mutex_init(&locker, NULL);        pthread_cond_init(&all_done, NULL);    }    /*增加要等待的线程数量,如果val为负数则是减少*/    void add(int val) {        pthread_mutex_lock(&locker);        count += val;        if (count < 0) {            cout << "error, count is a negative value" << endl;        } else if (count > 0) {            ;        } else {            cout << "send signal" << endl;            pthread_cond_signal(&all_done);        }        pthread_mutex_unlock(&locker);    }    /*线程执行完毕之后调用*/    void done() {        add(-1);    }    /*主线程调用wait阻塞在这里,直到所有的线程都运行完成*/    void wait() {        pthread_mutex_lock(&locker);        while (count != 0) {            pthread_cond_wait(&all_done, &locker);        }        pthread_mutex_unlock(&locker);    }};struct wait_group wp(3);void* tprocess1(void* args) {    sleep(3);    cout << "tprocess1" << endl;    wp.done();    return NULL;}void* tprocess2(void* args) {    sleep(2);    cout << "tprocess2" << endl;    wp.done();    return NULL;}void* tprocess3(void* args) {    sleep(1);    cout << "tprocess3" << endl;    wp.done();    return NULL;}int main(int argc, char** argv) {    pthread_t t1;    pthread_t t2;    pthread_t t3;    pthread_create(&t1, NULL, tprocess1, NULL);    pthread_create(&t2, NULL, tprocess2, NULL);    pthread_create(&t3, NULL, tprocess3, NULL);    wp.wait();    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果手机下载不了qq怎么办 附件预览时发生错误怎么办 手机下载的压缩包打不开怎么办 邮箱提示中转站剩余容量不足怎么办 手机邮箱密码忘记了怎么办 垃圾邮件被系统删除了怎么办 邮箱里的邮件下载不了怎么办 qq邮箱下载不了文件怎么办 苹果手机忘记邮箱密码怎么办 oppo手机安装包损坏怎么办 手机安装包损坏无法安装怎么办 手机qq安装包损坏了怎么办 安装包损坏无法安装怎么办 方舟生存进化安装包损坏怎么办 如果安装包坏了怎么办 酷狗下载音乐收费怎么办 酷狗下载歌曲收费怎么办 酷狗音乐下载歌曲要钱怎么办 酷狗音乐下载要钱怎么办 手机酷狗音乐下载收费怎么办 咪咕视频静音了怎么办 卡西欧自拍神器死机了怎么办 手机一自拍就死机怎么办 微信怎么黑屏了怎么办 宝宝睡袋买大了怎么办 社保中间断了一年怎么办 京东阅读换手机怎么办 酷狗自动续费怎么办 qq音乐下载需要钱怎么办 电脑播放音乐没声音怎么办 酷狗账号注销了怎么办 电脑酷狗音乐没有声音怎么办 百度云的视频被净网怎么办 v380用户名或密码错误怎么办 课堂派没签到的怎么办 微信加密忘记了怎么办 视频容量太大上传不了视频怎么办 小米手机打不开主页面怎么办 qq离线文件过期了怎么办 百度云有转存任务正在进行怎么办 港版索尼手机的浏览器怎么办