一、线程

同一进程的多个线程共享同一地址空间,线程强调的是共享,但是有些资源是每个线程各有一份。

共享:文件描述符表;每种信号的处理方式;当前工作目录;用户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;
}

结果:

wKioL1cjRluSZZ6qAAA8eIVhIhY934.png

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;
}

结果:

wKioL1cjUZ7DB_SwAABUpKSqiwY732.png

3.分离线程

线程是可结合的或者是可分离的,默认为可结合的。

    可结合的:可被其他线程回收其资源或者杀死,回收之前存储器的资源(栈)不释放,一般都要对其pthread_join()(阻塞方式等待),使用pthread_detach()可以将线程置为可分离;

    可分离的:不可被其它线程回收或杀死,它的资源在它终止时自动被系统释放,不可以join。