上一篇讲了如何组织线程 线程的基本概念(一)
线程控制
线程的创建
#include<pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
参数:
- 第一个参数为线程id(POXI线程库中使用的)
- 第二个参数为模式,一般为NULL
- 线程入口函数,返回值和参数都为 void *
- 线程入口函数的参数
线程退出
只是线程退出,并不终止整个进程
- 从线程入口函数return(主线程退出,即进程退出)(建议采用这种方式进行线程退出)
- 线程调用pthread_exit()函数终止自己
- 线程可以调用pthread_cancel()终止同一个线程组中任意线程(理解为强行退出,不建议采用)
线程等待
线程等待相较与进程等待,都是为了回收资源,但这里有两点不同
1.线程等待
.同一线程组中的线程可以相互等待
.只能是阻塞式等待
2. 进程等待
.只能父进程等子进程
.waitpid()函数可以进行非阻塞式等待
3. 存在僵尸进程,并没有僵尸线程的概念
int pthread_join(pthread_t thread, void **retval);
- 第一个参数.线程pid
- 第二个参数.线程入口函数的返回值
分离线程
int pthread_detach(pthread_t thread);
默认情况下,新创建的线程是joinable 线程退出后,需要进行线程等待(pthread_join())
来回收资源,否则会造成资源无法释放,造成内容泄露。而一般情况下,我们采用pthread_join()进行线程等待也是为了控制线程结束顺序
当我们不再关心线程结束顺序时,就可以分离线程 pthread_detach(),告诉操作系统当线程结束时自动回收线程资源。
也先也可以自己分离自己
pthread_detach(pthread_self());
一个简单的例子:
编译时加上 -lpthread 选项
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
//线程的入口函数
void * Entry(void * arg)
{
(void) arg;
while(1)
{
printf("new thread\n");
sleep(1);
}
}
void test()
{
pthread_t thread_1;
//创建一个线程
pthread_create(&thread_1,NULL,Entry,NULL);
int count=5;
while(1)
{
printf("main thread\n");
sleep(1);
if(count--==0)
{//线程退出
pthread_cancel(thread_1);
}
}
//等待线程,回收资源
pthread_join(thread_1,NULL);
}