多线程编程

基础知识点和代码实现

1.运行一个进程中的多个线程,彼此之间使用相同的地址空间,共享大部分数据。
2.启动一个线程所花费的空间远远小于启动一个进程所话费的空间。
3.线程间切换所需要的时间远远小于进程间切换所需要的时间。
4.不同进程具有独立的数据空间,数据的传递只能通过通信的方式。–费时、不方便统一进程下的线程之间共享数据空间,一个线程数据可以直接为其他线程所用。–快捷、方便。
5.编写多线程需要注意的地方:
有的变量不能同时被两个线程所修改,子程序中声明为static的数据可能为多线程带来灾难性打击。
6.多线程优点:
1)提高应用程序相响应,将耗时长的操作置于一个新的线程,避免等待。
2)使CPU多核系统更加高效。
3)改善程序结构。将长而复杂的进程可以分为多个线程。
7. 进程是资源分配的基本单位,线程没什么资源,共享进程资源。
8. volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。简单地说就是防止编译器对代码进行优化。

线程的同步和互斥:

1.互斥锁

互斥锁用来保证一段时间内只有一个线程在执行一段代码。一般使用流程:
定义一个锁(pthread_mutex_t)
初始化锁(pthread_mutex_init)
使用pthread_mutex_lock/pthread_mutex_unlock进行锁定和解锁。
注意:加锁、解锁之间不能return或break,否则会死锁。

2.信号量

信号量是一种特殊的变量,本质上是一个非负的整数计数器,可以被增加或减少,但系统保证对该变量的访问是原子操作(这能控制多个线程操作同一资源时的顺序问题)。如果一个程序中有多个线程试图改变一个信号量的值,系统将保证所有的操作都将依次进行。

这里需要引入新的头文件semaphore.h

sem_init 初始化信号量。该函数初始化由sem指向的信号对象,设置它的共享选项,并给它一个初始的整数值。pshared控制信号量的类型,如果其值为0,就表示这个信号量是当前进程的局部信号量,否则信号量就可以在多个进程之间共享,value为sem的初始值。调用成功时返回0,失败返回-1.
sem_post ( sem_t *sem ) 该函数用于以原子操作的方式将信号量的值加1。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞。
sem_wait( sem_t *sem ) 被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减1,表明公共资源经使用后减少。
sem_destroy 该函数用于清理用完的信号量。
条件变量
互斥锁是用来给资源上锁的,而条件变量是用来等待而不是用来上锁的。

条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。
通常条件变量和互斥锁同时使用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值