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