Unix-线程基本概念

线程提供了允许一个程序同时完成多项任务的机制;所有线程都在同一个进程的地址空间运行;多个线程共享同一个内存空间、同样的文件描述符及其他资源。Linux中采用线程API–pthread,所有线程相关函数和数据类型都包含在<pthread.h>中。
1.1 线程标识
每个线程也有一个标识,且仅在其所属进程上下文中才具有唯一性。
线程标识类型 pthread_t
可采用以下函数比较两个线程标识是否相等:

#include<pthread.h>
int pthread_equal(pthread_t t1,pthread_t t2); //非0 则t1和t2相等 ;0则不相等。

线程可以通过调用pthread_self函数获得自身线程标识:

#include<pthread.h>
pthread_t pthread_self(void);

1.3 创建线程
新增的线程可以通过调用pthread_createh函数创建。

#include<pthread.h>
int pthread_create(pthread_t *tidp, const pthread_attr_t *atr,
					void *(*start_rtn)(void *), void *arg);

tidp–新建线程ID将被设置成tidp指向的内存的单元;
attr–线程属性;
start_rtn–线程从start_rtn函数地址开始执行;
arg–start_rtn函数传递的参数,如果超过一个,需要定义成结构体形式,将该结构体地址作为arg参数传入。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<pthread.h>
typedef unsigned long u32;
pthread_t ntid; //线程标识
void printids(const char *);
void *run(void *); //线程函数
 int main()
{
	int err;
	err=pthread_create(&ntid,NULL,run,NULL);//创建线程
	if(err!=0)
	{
		printf("can't create thread:%s!\n",strerror(err));
		exit(1);
    }
    printids("main thread:");
    sleep(1);
	return 0;
}
void printids(const char *s)
{
	pid_t pid;
	pthread_t tid;
	pid=getpid();
	tid=pthread_self();
	printf("%s pid %u tid %u (0x%x) \n",s,(u32)pid,(u32)tid,(u32)tid);
}
void *run(void *arg)
{
	printids("new thread:");
	return((void *)0);
}

在这里插入图片描述
我们在Liunx上执行上述demo,可以看到,两个线程对应的进程ID pid是相同的,而线程ID tid则不同。
1.3 终止线程
线程可通过以下三种方式退出,可在不终止进程的前提下,停止其控制流:
1)线程从线程函数中返回,返回值为线程的退出码;
2)线程被同一进程的其他线程终止,即被取消(pthread_cancel);
3) 线程执行 pthread_exit。

#include<pthread.h>
void pthread_exit(void *pRetVal);

pRetVal–无类型指针

1.4 线程同步
一个进程内的多个线程需要共享内存和资源,必须保证每个线程看到的数据视图一致性,确保线程在访问变量的存储内容时不会访问到无效的值,需要对线程进行同步处理。相关线程同步机制如下:
1.互斥量(也叫互斥锁):解决多个线程同时访问临界资源所导致的错误,确保同一时间只有一个线程访问数据,数据类型pthread_mutex_t;

#include<pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);//对互斥量进行加锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);//对互斥量解锁
int pthread_mutex_trylock(pthread_mutex_t *mutex);//尝试是否可以成功对互斥量进行加锁
  1. 在使用互斥量之前,必须对其进行初始化,可通过调用pthread_mutex_inti函数实现。
#include<pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

使用默认属性初始化互斥量可将attr设为NULL。
2)使用动态分配的互斥量,释放内存时可采用pthread_mutex_destory函数

#include<pthread.h>
int pthread_mutex_destory(pthread_mutex_t *mutex);

2.条件变量:条件变量是另外一种可用的线程同步机制。条件变量与互斥量一起使用可使线程以无竞争方式等待指定的条件发生。
线程在改变条件变量状态前,需要先拿到锁,因为互斥量必须在锁定后才能开始计算条件。

  1. 使用条件变量前,需要先进行初始化。初始化方式有两种:,如果是静态分配的条件变量,则将PTHREAD_COND_INITILIZER赋值给cond;如果是动态分配的条件变量,则调用pthread_cond_init函数进行初始化。
#include<pthread.h>
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
  1. 如果是动态分配的条件变量,释放条件变量低层内存前,需要使用pthread_cond_destory函数对条件变量进行释放。
#include<pthread.h>
int pthread_cond_destory(pthread_cond_t *cond);
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值