一、线程
同一进程的多个线程共享同一地址空间,线程强调的是共享,但是有些资源是每个线程各有一份。
共享:文件描述符表;每种信号的处理方式;当前工作目录;用户id和组id。
私有:线程id;上下文(寄存器值,计数器,栈指针);栈空间;errno变量;信号屏蔽字;调度优先级。
二、线程控制
1.创建线程
int pthread_create(pthread_t *thread, const pthread_tsttr_t *attr, void *(*start_routine)(void *), void *arg);
成功返回0,失败返回错误号(用strerror()打印错误消息)
函数说明:调用pthread_create()函数创建新的线程后,当前线程从pthread_create()返回后继续执行,新的线程由void *start_routione(void *arg)执行,当start_routione返回时,则线程退出。attr,线程属性,这里取缺省值,传NULL。
示例代码如下:
#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include<stdlib.h>
pthread_t tid;
void *thread(void *_val)
{
printf("%s:pid is:%d, tid is:%u\n", (char*)_val, (int)getpid(), (unsigned long long)pthread_self());
return NULL;
}
int main()
{
int err = pthread_create(&tid, NULL, thread, "other theard");
if(err != 0)
{
printf("create pthread fail,info is %s", strerror(err));
exit(err);
}
printf("main thread:pid is:%d,main tid is:%u\n", (int)getpid(), (unsigned long long)pthread_self());
sleep(1);
return 0;
}
结果:
2.终止线程
a.从线程函数return;(主线程的return相当于exit)
b.别的线程取消自己,pthread_cancel();
c.自己终止自己,pthread_exit()。
void ptheard_exit(void *retval);
void pthread_cancel(void *retval);
线程等待
int pthread_join(pthread_ thread, void **retval);
成功返回0,失败返回错误号.
一般情况下,线程终止后,一直保留自己的终止状态,直到其他线程调用pthread_join(),以获取它的终止值。
代码如下:
#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include<stdlib.h>
void *thread1(void *_val)
{
printf("thread1 returning...\n");
return NULL;
}
void *thread2(void *_val)
{
printf("thread2 exiting...\n");
pthread_exit(NULL);
}
void *thread3(void *_val)
{
while(1)
{
printf("thread3 canceling...\n");
sleep(1);
}
return NULL;
}
int main()
{
pthread_t tid;
void *tret;
pthread_create(&tid, NULL, thread1, NULL);
pthread_join(tid, &tret);
printf("thread return,tid is:%u\n", (unsigned long long)tid);
pthread_create(&tid, NULL, thread2, NULL);
pthread_join(tid, &tret);
printf("thread exit,tid is:%u\n", (unsigned long long)tid);
pthread_create(&tid, NULL, thread3, NULL);
sleep(3);
pthread_cancel(tid);
pthread_join(tid, &tret);
printf("thread cancel,tid is:%u\n", (unsigned long long)tid);
return 0;
}
结果:
3.分离线程
线程是可结合的或者是可分离的,默认为可结合的。
可结合的:可被其他线程回收其资源或者杀死,回收之前存储器的资源(栈)不释放,一般都要对其pthread_join()(阻塞方式等待),使用pthread_detach()可以将线程置为可分离;
可分离的:不可被其它线程回收或杀死,它的资源在它终止时自动被系统释放,不可以join。
转载于:https://blog.51cto.com/green906/1768736