[c++] 多线程demo

#include <cstdio>                                                                                                                                                                                    
#include <iostream>
#include <pthread.h>
#include <unistd.h>
using namespace std;

#define NUM 5

/*
 * 线程运行函数
 * 传入传出都是 void指针
 * */
void* run(void* a)
{
    printf("hahaha\n");
    return NULL;
}

/*
 * 手动join的线程的demo
 * */
void join_demo()
{
    pthread_attr_t attr; //定义线程属性变量
    pthread_attr_init(&attr);//初始化 线程属性
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);//设置线程属性 为 joinable线程
    pthread_attr_setstacksize(&attr, 1024000); //设置线程堆栈大小,b

    pthread_t* m_thread = (pthread_t*)malloc(sizeof(pthread_t)); //开辟内存
    if(m_thread == NULL)
        return ;

    pthread_create(m_thread, &attr, run, NULL);//创建线程   返回的线程指针,线程的属性,运行函数,传入参数
    pthread_join(*m_thread,NULL);   //等待线程结束  传入一个指针接返回信息
    pthread_attr_destroy(&attr);    //销毁线程属性
    if(m_thread != NULL) free(m_thread);                        //释放内存
    return;
}
/*                                                                                                                                                                                                   
 * 自动结束清理资源的线程
 * 注意子进程不能结束太快,不然创建函数返回的参数会出错
 * */
void detach_demo()
{
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    pthread_attr_setstacksize(&attr, 1024000);

    pthread_t* m_thread = (pthread_t*)malloc(sizeof(pthread_t));
    if(m_thread == NULL)
        return;

    pthread_create(m_thread, &attr, run, NULL);
    pthread_attr_destroy(&attr);
    if(m_thread != NULL) free(m_thread);
    return;
}

void multi_pthread()
{
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    pthread_attr_setstacksize(&attr, 1024000);

    pthread_t* m_thread_vec[10];
    for(int i = 0; i < NUM; i++)
    {
        if ( (m_thread_vec[i] = (pthread_t*)malloc(sizeof(pthread_t)) ) == NULL)
            return;
        printf("create %d \n", i);
        pthread_create(m_thread_vec[i], &attr, run, NULL);
    }
    pthread_attr_destroy(&attr);
    sleep(1);
    for(int i = 0; i < NUM; i++)
        if(m_thread_vec[i] != NULL) free(m_thread_vec[i]);
    return ;
}
                                                                                                                                                                                                     
/*
 * 带栅栏的线程调用的函数
 * 注意线程中进来之后要wait
 * */
void* run_with_barr(void* param_ptr)
{
    pthread_barrier_t* barr_ptr = static_cast<pthread_barrier_t*>(param_ptr);
    pthread_barrier_wait(barr_ptr); //阻塞  表示自己已就绪,等待其他的就绪
    run(NULL);
    return NULL;
}

/*
 * 栅栏的使用
 * */
void multi_pthread_with_barrier()
{
    pthread_barrier_t barr;//定义栅栏
    pthread_barrier_init(&barr, NULL, NUM+1); //初始化栅栏   栅栏,栅栏属性,总数量 + 1   (加一是为了等全部就绪后 由主线程开始)

    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    pthread_attr_setstacksize(&attr, 1024000);

    pthread_t* m_thread_vec[NUM];
    for(int i = 0; i < NUM; i++)
    {
        if ( (m_thread_vec[i] = (pthread_t*)malloc(sizeof(pthread_t)) ) == NULL)
            return;
        printf("create %d \n", i);
        pthread_create(m_thread_vec[i], &attr, run_with_barr, &barr);
        usleep(300000);
    }

    pthread_barrier_wait(&barr); //此处应为最后一个wait 不再阻塞,开始全部正在等待的线程

    pthread_attr_destroy(&attr);
    pthread_barrier_destroy(&barr);//销毁栅栏
    sleep(1);
    for(int i = 0; i < NUM; i++)
        if(m_thread_vec[i] != NULL) 
    free(m_thread_vec[i]);                                                                                                                                           
    return ;
}

int main()
{
    multi_pthread_with_barrier();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sszzyzzy/article/details/89204050