Linux POSIX线程实现wait_group功能

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 
#include 
#include 
#include  
#include 
#include 
#include 
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;
}

你可能感兴趣的:(操作系统,线程,posix,linux)