Linux系统编程(九)线程同步

  • 一、什么是线程同步?
  • 二、互斥量
  • 三、条件变量
    • pthread_cond_wait函数
    • pthread_cond_signal函数
  • 生产者和消费者模型

一、什么是线程同步?

线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其它线程为保证数据一致性,不能调用该功能。

二、互斥量

Linux中提供一把互斥锁mutex(也称之为互斥量)。每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁,资源还是共享的,线程间也还是竞争的,但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>pthread_mutex_t mutex;  //定义锁
void* tfn(void* arg)
{srand(time(NULL));while (1) {//加锁pthread_mutex_lock(&mutex);printf("hello ");sleep(rand() % 3);  /*模拟长时间操作共享资源,导致cpu易主,产生与时间有关的错误*/printf("world\n");//解锁pthread_mutex_lock(&mutex);pthread_mutex_unlock(&mutex);sleep(rand() % 3);}return NULL;
}int main(void)
{int flg = 5;pthread_t tid;srand(time(NULL));//初始化锁pthread_mutex_init(&mutex,NULL); //mutex==1pthread_create(&tid,NULL,tfn,NULL);while (1) {//加锁pthread_mutex_lock(&mutex);printf("HELLO ");sleep(rand() % 3);printf("WORLD\n");//解锁pthread_mutex_unlock(&mutex);sleep(rand() % 3);}pthread_cancel(tid);pthread_join(tid, NULL);pthread_mutex_destroy(&mutex);return 0;
}

三、条件变量

pthread_cond_wait函数

阻塞等待一个条件变量
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
函数作用:

  1. 阻塞等待条件变量cond(参1)满足
  2. 释放已掌握的互斥锁(解锁互斥量)相当于pthread_mutex_unlock(&mutex);
    1.2.两步为一个原子操作。
  3. 当被唤醒,pthread_cond_wait函数返回时,解除阻塞并重新申请获取互斥锁pthread_mutex_lock(&mutex);

pthread_cond_signal函数

int pthread_cond_signal(pthread_cond_t *cond);
唤醒至少一个阻塞在条件变量上的线程

生产者和消费者模型

struct msg *head = NULL;
struct msg *mp = NULL;pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;void *producter(void *arg)
{while (1) {mp = malloc(sizeof(struct msg));mp->num = rand() % 400 + 1;printf("---producted---%d\n", mp->num);pthread_mutex_lock(&mutex);mp->next = head;head = mp;pthread_mutex_unlock(&mutex);pthread_cond_signal(&has_product);sleep(rand() % 3);}return NULL;
}void *consumer(void *arg)
{while (1) {pthread_mutex_lock(&mutex);while (head == NULL) {pthread_cond_wait(&has_product, &mutex);}mp = head;head = mp->next;pthread_mutex_unlock(&mutex);printf("------------------consumer--%d\n", mp->num);free(mp);mp = NULL;sleep(rand() % 3);}return NULL;
}int main(void)
{pthread_t ptid, ctid;pthread_create(&ptid, NULL, producter, NULL);pthread_create(&ctid, NULL, consumer, NULL);pthread_join(ptid, NULL);pthread_join(ctid, NULL);return 0;
}

Linux系统编程(九)线程同步相关推荐

  1. 【Linux系统编程】线程同步与互斥:POSIX无名信号量

    信号量概述 信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问. 编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 ...

  2. 【Linux系统编程】线程同步与互斥:读写锁

    读写锁基本原理 当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住.但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但是由于互 ...

  3. 【Linux系统编程】线程同步与互斥:互斥锁

    为什么需要互斥锁? 在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源.这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在此刻使用打印机打印东西, ...

  4. Linux系统开发9 线程同步

    [本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> Linux系统编程8 线程同步多线程共享资源,不加锁,同步互斥演示多线程共享资源,加锁,同 ...

  5. linux系统编程:线程原语

    线程原语 线程概念 线程(thread),有时被称为轻量级进程(Lightweight Process,LWP).是程序运行流的最小单元.一个标准的线程由线程ID.当前指令指针(PC),寄存器集合和堆 ...

  6. 【Linux系统编程】线程基本操作

    00. 目录 文章目录 00. 目录 01. 线程概述 02. 线程常用函数 2.1 获取线程号 2.2 线程号比较 2.3 线程创建 2.4 回收线程资源 2.5 线程分离 2.6 线程退出 03. ...

  7. 【Linux系统编程】线程的基本操作

    概述 每个进程都拥有自己的数据段.代码段和堆栈段,这就造成进程在进行创建.切换.撤销操作时,需要较大的系统开销.为了减少系统开销,从进程中演化出了线程.为了让进程完成一定的工作,进程必须至少包含一个线 ...

  8. Linux系统编程——多任务的同步与互斥

    现代操作系统基本都是多任务操作系统,即同时有大量可调度实体在运行.在多任务操作系统中,同时运行的多个任务可能: 都需要访问/使用同一种资源 多个任务之间有依赖关系,某个任务的运行依赖于另一个任务 这两 ...

  9. 【Linux系统编程】线程池

    00. 目录 文章目录 00. 目录 01. 线程池原理 02. 线程池应用实例 03. 线程池代码 04. 附录 01. 线程池原理 在传统服务器结构中,常是有一个总的监听线程监听有没有新的用户连接 ...

  10. 【Linux系统编程】线程私有数据

    00. 目录 文章目录 00. 目录 01. 线程之间共享数据 02. 线程私有数据 2.1 创建线程私有数据 2.2 销毁线程私有数据 2.3 关联线程私有数据成员 2.4 读取线程私有数据所关联的 ...

最新文章

  1. 2016.01.19 UITextField
  2. matlab verilog 接口,使用SystemVerilog简化FPGA中的接口
  3. 方欣科技算法面试:蛇形矩阵2
  4. jupyter notebook报错Failed to load module appmenu-gtk-module
  5. 线程池源码分析-FutureTask
  6. [渝粤教育] 西安交通大学 医学伦理学(2021秋) 参考 资料
  7. Python的dnspython库使用指南
  8. linux如何加入windows域
  9. 15年里,对您触动最大的中西方管理著作或思想是什么?
  10. 6、Cocos2dx 3.0游戏开发找小三之游戏的基本概念
  11. 游戏策划入门(6)——把模块变成现实
  12. 《AP音频分析仪的使用》
  13. umts是移动还是联通_WCDMA/GSM是什么意思 是电信移动还是联通
  14. 记项目现场的翻车事故
  15. google map 的地图偏移 火星坐标
  16. forEach和$.each()以及$().each()的用法
  17. win7环境下安装ubuntu双系统
  18. 智能血压计方案/设计案列/APP/小程序
  19. zhaowei -列表知识问答(王者农药)
  20. 查找过的资料-防丢失

热门文章

  1. bzoj1588 [HNOI2002]营业额统计
  2. hello程序的运行过程-从计算机系统角度
  3. while和for循环
  4. DevExpress GridControl 后台设置列
  5. Ubuntu 14.10 -- 异次元软件世界
  6. 控制器中获取Field值
  7. WPF 操作 richTextBox
  8. 关于重装系统后或打补丁后不能上网的问题的解决
  9. mysql单表索引个数_MySQL性能:多个表与单个表和分区上的索引
  10. 总是助手服务器失败怎么回事,《遇见逆水寒》连接服务器失败解决方法汇总 服务器连接失败问题原因...