Linux--多线程

在操作系统原理的术语中,线程是进程的一条执行路径。线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,所有的线程都是在同一进程空间运行,这也意味着多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。 一个进程可以有很多线程,每条线程并行执行不同的任务。

Linux--多线程主线程和子线程通常定义以下两种关系:

  1. 可会合(joinable):这种关系下,主线程需要明确执行等待操作,在子线程结束后,主线程的等待操作执行完毕,子线
    程和主线程会合,这时主线程继续执行等待操作之后的下一步操作。主线程必须会合可会合的子线程。在主线程的线程函
    数内部调用子线程对象的wait函数实现,即使子线程能够在主线程之前执行完毕,进入终止态,也必须执行会合操作,否
    则,系统永远不会主动销毁线程,分配给该线程的系统资源也永远不会释放。
  2. 相分离(detached):表示子线程无需和主线程会合,也就是相分离的,这种情况下,子线程一旦进入终止状态,这种
    方式常用在线程数较多的情况下,有时让主线程逐个等待子线程结束,或者让主线程安排每个子线程结束的等待顺序,是
    很困难或不可能的,所以在并发子线程较多的情况下,这种方式也会经常使用。

Linux创建线程

#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *),*arg);

代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <error.h>
#include <pthread.h>

void *thread_func1(void *args);
void *thread_func2(void *args);

int main (int argc,char * argv)
{
	pthread_t tid;
	pthread_attr_t thread_attr;
	if (pthread_attr_init(&thread_attr))
	{
		perror("pthread_attr_init() fail!");
		return -1;
	}
	if (pthread_attr_setstacksize(&thread_attr,120*1024))
	{
		perror("pthread_attr_setstacksize() fail!");
		return -2;
	}
	if (pthread_attr_setdetachstate(&thread_attr,PTHREAD_CREATE_DETACHED))
	{
		perror("pthread_attr_setdetachstate() fail!");
		return -3;
	}
	pthread_create(&tid,&thread_attr,thread_func1,NULL);
	printf("pthread_create func1 successful!\n");
	pthread_create(&tid,NULL,thread_func2,NULL);
	printf("pthread_create func2 successful!\n");
	pthread_attr_destroy(&thread_attr);
	printf("destroy pthread_addr successful!\n");
	pthread_join(tid,NULL);
	printf("destroy pthread_addr successful!\n");

		printf("i am doing something in the main func!\n");
	return 0;
}

void *thread_func1(void *args)
{
	while(1)
	{
		printf("i am doing something in the func1................!\n");
		sleep(5);
	}
	return 0;
}
void *thread_func2(void *args)
{
		printf("i am doing something in the func2................!\n");
		sleep(50);
	return 0;
}

:gcc编译加-lpthread

线程锁

如果一个资源会被不同的线程访问修改,那么我们把这个资源叫做临界资源,那么对于该资源访问修改相关的代
码就叫做临界区
互斥锁

pthread_mutex_init()