UNIX进程有了多个控制线程以后,在程序设计时可以把进程设计成在同一时间不止做一件事情,每个线程处理各自独立的任务。
线程与进程的关系:
线程包含了表示进程执行环境必须的信息,其中包含表示线程的线程ID,一组寄存器值,栈,调度优先级和策略,信号屏蔽字,errno变量以及线程私有数据。
进程的所有信息对该进程的所有线程都是共享的,包含可执行的程序文本,程序的全局内存和堆内存,栈以及文件描述符。
关于线程ID的函数
#include <pthread.h>
int pthread_equal(pthread_t tid1,pthread_t tid2);//比较两个线程ID,相当返回0
pthread_t pthread_self(void);//获得自身的线程ID
(1)线程的创建
#include <pthread.h>
int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rin)(void),void *restrict arg);
成功返回0
第一个参数指向的内存单元被设置成新创建线程的线程ID。
attr参数用于定制线程属性,这里设置为NULL。
第三个参数可以传递一个函数的指针
如果函数有参数,那么可以把参数作为一个结构体由第四个参数传入。(线程的创建并不能保证哪个线程会先运行)
(2)线程终止(线程还可以被同一进程的其他线程取消)
#include <pthread.h>
void pthread_exit(void *rval_ptr);
rvtal_ptr就是一个指针
可以用
int pthread_join(pthread_t thread,void** rval_ptr);//来访问
如果成功就返回0,失败则返回错误编号
调用线程将一直阻塞,直到指定的线程调用pthread_exit,从启动历程中返回会被取消。
若对线程返回值不感兴趣,那么久可以把rtval_ptr设置为NULL,这样就光等待指定线程终止。
示例代码
#include <stdio.h>
#include <pthread.h>
void *fun(void* arg)
{
printf("线程id%d\n",pthread_self());
pthread_exit(NULL);
}
int main()
{
pthread_t id;
pthread_create(&id,NULL,fun,NULL);//线程在创建的这一刻就开始调用函数fun了
if( pthread_join(id,NULL)==0)
{
printf("线程结束\n");
}
printf("进程的线程id%d\n",pthread_self());
return 0;
}
272

被折叠的 条评论
为什么被折叠?



