0.线程特点
(1).线程共享资源:一个进程下的多个线程共享以下资源
可执行的指令
静态数据
进程中打开的文件描述符
当前工作目录
用户ID
用户组ID
(2).线程私有资源:
线程ID
PC(程序计数器)和相关寄存器
堆栈
错误号(errno)
优先级
执行状态和属性
一.C函数创建线程、回收线程、结束线程
1.创建线程 - pthread_create
功能:
创建一个线程,成功时返回(0),失败时返回错误码(errno)
参数:
thread: 线程对象
attr : 线程属性,NULL则表示默认属性
void*(*routine)(void*):线程执行的函数
arg :传递给线程执行函数的参数
int pthread_create(pthread_t *thread,const pthread_attr_t *attr,
void*(*routine)(void*),void *arg);
2.线程回收 - pthread_join
功能:
回收线程资源,成功时返回0,失败返回错误码。
调用线程阻塞直到pthread结束
参数:
thread : 线程对象,指定要回收的线程
retval : 接收线程返回值的地址
int pthread_join(pthread_t thread,void **retval);
3.线程结束 - pthread_exit
功能:
结束当前的线程,释放该线程的私有资源。
参数:
retval: 可被其他线程通过 pthread_join 获取。
void pthread_exit(void *retval);
4.线程创建、回收、结束,代码示例
#include <stdio.h>
#include <stdint.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
char message[32] = "Hello World";
void *thread_func(void *arg);
int main()
{
pthread_t a_thread; //创建线程对象
void *result; //用于接收线程返回值
int ret;
/* 创建线程,绑定线程执行函数 */
ret = pthread_create(&a_thread,NULL,thread_func,NULL);
if(0 != ret)
{
printf("fail to pthread_create\n");
exit(-1);
}
/* 阻塞等待回收线程资源 */
pthread_join(a_thread,&result); //将结果存入result
printf("result is :%s\n",result);
printf("message is :%s\n",message);
return 0;
}
/* 线程函数 */
void *thread_func(void *arg)
{
sleep(1);
printf("thread_func has been created\n");
strcpy(message,"marked by thread_func\n");
/* 结束线程 */
pthread_exit("thank you for waiting for me\n"); //线程结束返回参数信息
}