Linux之---多线程编程(线程安全&线程同步)

一、线程概念:

线程是进程内部的一条执行序列,一条有序指令的集合。线程是轻量级的进程,一个进程中至少要包含一条线程,main函数代表的执行流称之为主线程。

二、进程与线程的区别

根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位。

1.同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程中至少包含一个线程。
2.进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会     影响同个进程中的其他线程的结束.。
3.线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
4.线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源 。

三、线程的数据共享原理:  --------》4G虚拟地址空间

线程在进程内部,内存为进程分配虚拟地址空间,其内部的进程中的数据都会储存于.data段或者.bss段,因此对于一个进程中的多个线程来说他们的数据是共享的。

四、线程安全

因为多线程之间共享数据段,并且线程是并发运行的,甚至会并行执行,因此程序的执行具有不确定性。如果不对线程加以控制,则程序执行产生的结果具有二义性。

五、多线程的坏处

引入多线程后,系统的执行路径变成了多条,并且这多条执行路径在并发运行。首先程序的执行具有一定的不确定性,每次程序执行的结果可能会不同,因为程序交替执行的顺序不同了。其次,某些资源的访问出现了竞争,需要进行资源同步,这样使得程序的可靠性与稳定性降低。

六、线程同步的方法(互斥锁、条件变量、信号量)

1.互斥锁

(1)初始化锁:

静态分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

动态分配:int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr_t *mutexattr);

(2)加锁:对共享资源的访问,要对互斥量进行加锁,如果已经上锁,调用线程就会阻塞,直到该互斥量被解锁;

int pthread_mutex_lock(pthread_mutex *mutex);

int pthread_mutex_trylock(pthread_mutex_t *mutex);

(3)解锁:完成对共享资源的访问后,要对互斥量进行解锁;

int pthread_mutex_unlock(pthread_mutex_t *mutex);

(4)销毁锁:锁在使用完后,销毁锁以释放资源;

int pthread_mutex_destroy(pthread_mutex *mutex);

2.条件变量:自动阻塞一个线程,直到某种特殊情况发生为止,一般与互斥锁同时使用。

(1)初始化条件变量;

(2)等待条件成立,释放锁,同时阻塞等待条件变量为真才行(加锁保证只有一个线程wait);

(3)激活条件变量,激活所有等待线程;

(4)去掉条件变量;

3.信号量

如同进程一样,线程也能够通过信号量来实现通信,虽说是轻量级的。信号量函数的名字都以“sem_”打头。线程使用的基本信号量函数有四个。

(1)信号量初始化:

int sem_init (sem_t *sem , int pshared, unsigned int value);

这是对由sem指定的信号量进行初始化,设置好它的共享选项(linux 只支持为0,即表示它是当前进程的局部信号量),然后给它一个初始值VALUE。

(2)等待信号量。给信号量减1(p操作),然后等待直到信号量的值大于0(此时有资源给线程分配)。

int sem_wait(sem_t *sem);

(3)释放信号量。信号量值加1。并通知其余等待线程。

int sem_post(sem_t *sem);

(4)销毁信号量。我们用完信号量后都它进行清理。归还占有的一切资源。

int sem_destroy(sem_t *sem);

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值