线程等待
#include <pthread.h>
/*
*功能:
* 等待子线程结束, 并回收子线程资源
*参数:
* thread: 被等待的线程号
* retval: 用来存储线程退出状态的指针的地址
*return:
* 成功:0
* 失败:非0
*/
int pthread_join(pthread_t thread, void **retval);
验证 pthread_join 的阻塞效果
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void *thead(void *arg);
int main(int argc,char *argv[])
{
pthread_t tid1;
int ret = 0;
void *value = NULL;
ret = pthread_create(&tid1, NULL, thead, NULL);
if(ret != 0)
{
perror("pthread create");
}
pthread_join(tid1,&value);
printf("value = %d\n",*(int *)value);
return 0;
}
void *thead(void *arg)
{
static int num = 100;
printf("after 2 seceonds, thread will return\n");
sleep(2);
return #
}
验证 pthread_join 接收线程的返回值
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void *thead(void *arg);
int main(int argc, char *argv[])
{
pthread_t tid1;
int ret = 0;
int value = 0;
ret = pthread_create(&tid1, NULL, thead, NULL);
if(ret != 0)
{
perror("pthread_create");
}
pthread_join(tid1, (void*)(&value));
printf("value = %d\n",value);
return 0;
}
void *thead(void *arg)
{
int num = 100;
printf("after 2 seceonds, thread will return\n");
sleep(2);
return (void*)num;
}
线程分离
#include <pthread.h>
/*
*功能:
* 使调用线程与当前进程分离, 使其成为一个独立的线程, 该线程终止时, 系统将自动回收它的资源
*参数:
* thread: 线程号
*return:
* 成功:0
* 失败:非0
*/
int pthread_detatch(pthread_t thread);
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void *thead(void *arg);
int main (int argc, char *argv[])
{
int ret = 0;
pthread_t tid1;
ret = pthread_create(&tid1, NULL, thead, NULL);
if(ret != 0)
{
perror("ptread_create");
}
pthread_detach(tid1);
pthread_join(tid1, NULL);
printf("after join\n");
sleep(3);
printf("I am leaving");
return 0;
}
void *thead(void *arg)
{
int i;
for(i = 0;i < 5;i++)
{
printf("I am runing\n");
sleep(1);
}
return NULL;
}
线程退出
在进程中我们可以调用 exit 函数或_exit 函数来结束进程, 在一个线程中我们可以通过以下三种在不终止整个进程的情况下停止它的控制流
线程从执行函数中返回
线程调用 pthread_exit 退出线程
线程可以被同一进程中的其它线程取消
线程退出函数
#include <pthread.h>
/*
*功能:
* 退出调用线程
*参数:
* retval:存储线程退出状态的指针
*注意:
* 一个进程中的多个线程是共享该进程的数据段,通常线程退出后所占用的资源并不会释放
*/
void pthread_exit(void *retval);
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void *thread(void *arg);
int main(int argc, char *argv[])
{
int ret = 0;
pthread_t tid;
void *value = NULL;
ret = pthread_create(&tid, NULL, thread, NULL);
if(ret != 0)
{
perror("pthread_create");
}
pthread_join(tid, &value);
printf("value = %p\n",(int *)value);
return 0;
}
void *thread(void *arg)
{
int i = 0;
while(1)
{
printf("I am running\n");
sleep(1);
i++;
if(3 == i)
{
pthread_exit((void*)1);
}
}
return NULL;
}