首页 > 编程语言 >学习笔记7——并发编程与线程同步

学习笔记7——并发编程与线程同步

时间:2023-10-29 21:47:27浏览次数:37  
标签:并发 void 编程 互斥 线程 pthread mutex

学习笔记7——并发编程与线程同步

本文将深入探讨并发编程的概念,介绍了并行计算的重要性,比较了顺序算法与并行算法,解释了线程的原理和相对于进程的优势,并通过示例介绍了在Pthread中进行线程操作。我们还将讨论线程同步工具,如互斥量、信号量和屏障,以及如何避免并发程序中的死锁问题。

一、概述

在计算机科学中,并行计算是一种利用多个计算资源同时解决计算问题的方法。并行计算的关键概念包括将问题分解成离散部分、并发执行这些部分、协调不同部分的执行,以及确保总体控制和调度。并行计算通常需要多核计算机或者连接在一起的多台计算机。

并行计算的计算问题应具备以下特点:

  1. 能够分解成并发执行的离散部分。
  2. 不同部分可以在任意时刻执行。
  3. 使用多个计算资源的时间要小于使用单个计算资源的时间。

计算资源包括多处理器/多核计算机和多台连接在一起的计算机。

二、线程

线程是操作系统中能够进行运算调度的最小单位,它是进程中的实际运作单位。线程能够并行执行不同的任务,使得多个任务可以同时进行。线程的调度可以由操作系统内核进行(内核线程)或由用户进程自行调度(用户线程)。线程之间可以共享同一进程的资源。

1. 线程管理

创建一个新的线程

int pthread_create(pthread_t *pthread_id, const pthread_attr_t *attr, void *(*func)(void *), void *arg);
  • pthread_id是指向pthread_t类型变量的指针,用于存储线程的唯一标识。
  • attr是指向线程属性的指针,可以用于设置线程的属性。
  • func是新线程的入口函数。
  • arg是传递给线程入口函数的参数。

线程终止

void pthread_exit(void *retval);

等待线程结束

int pthread_join(pthread_t thread, void **retval);

返回线程ID

pthread_t pthread_self(void);

2. 线程同步

在多个线程共享内存时,需要确保每个线程能够访问一致的数据。线程同步的工具包括互斥量、信号量和屏障。

互斥量

互斥量用于保护数据,确保同一时间只有一个线程能够访问数据。互斥量的使用需要调用pthread_mutex_lock进行加锁,以及pthread_mutex_unlock进行解锁。如果多个线程试图同时访问被互斥量保护的数据,其中一个线程会被阻塞。

int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);

死锁预防

为了避免死锁,需要小心控制互斥量的加锁顺序。确保所有线程都按照相同的顺序加锁,以避免交叉锁定互斥量。

信号量

信号量是一种用于进程同步的通用机制,用来表示可用资源的数量。信号量可以用于控制并发访问共享资源。

3. 屏障

线程连接操作允许一个线程等待其他线程的结束。主线程可以创建一个屏障对象,然后等待其他线程在屏障处汇合。一旦所有线程都到达屏障,它们可以继续执行。这是一种集合点,而不是线程的终结点。

苏格拉底挑战问答



结语

并发编程是一个复杂的主题,要求开发人员小心处理线程之间的交互和数据共享。了解并使用线程同步工具,如互斥量、信号量和屏障,对于避免竞态条件和死锁问题至关重要。希望本文能够帮助您更好地理解并发编程和线程同步的重要性。

标签:并发,void,编程,互斥,线程,pthread,mutex
From: https://www.cnblogs.com/lududuze/p/17796552.html

相关文章

  • 线程安全,读-取 ,都加锁
    如果一个线程修改属性,而另一个线程读取相同的属性,那么在多线程环境中,为了确保数据的一致性,通常也需要使用锁来同步访问。即使一个线程只读取属性而不修改它,也不能保证在读取的同时,另一个线程进行修改操作。如果没有适当的同步机制,可能会导致读取到不一致或不完整的数据。以下是......
  • 多线程读取多个摄像头并把画面显示到Tkinter 的 label上面
    importcv2importthreadingimporttkinterastkfromPILimportImage,ImageTkclassCameraThread(threading.Thread):def__init__(self,camera_index,label):threading.Thread.__init__(self)self.camera_index=camera_indexs......
  • 一种编程思想——利用settings文件实现功能的增减
    一.正常函数版本的思路1.notify.pydefwechat(content):print('微信通知:%s'%content)defqq(content):print('qq通知:%s'%content)defemail(content):print('邮箱通知:%s'%content) 2.start.pyfromnotifyimport*defsend_all(c......
  • python两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比
    两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单实例#!/usr/bin/python#-*-coding:UTF-8-*-foriinrange(ord('x'),ord('z')+1):forjinra......
  • EDA工具使用+GIT操作+python编程+C语言编程+Riscv相关+TCL操作
    EDA工具使用Verdi覆盖率转网页urg-full64-dirsimv.vdbVerdi加载sessionverdi-ssrsessionFileVcs分部编译额外选项-partcomp:自动分块编译。-fastpartcomp:使用多核计算系统并行部分编译。-pcmakeprof:查看每部分编译占用的时间,方便对时间更久的进行拆分。-partc......
  • C++多线程编程——线程的基本概念和使用方法
    什么是线程?在计算机科学中,线程是进程中的一个执行控制单元,也被称为执行路径。每个进程可以包含多个线程,每条线程并行执行不同的任务。线程是操作系统可识别的最小执行和调度单位。进程和线程的区别进程是程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的......
  • Unix/Linux系统编程自学笔记-第四章:并发编程
    1、并行计算并行计算并行计算是一种计算方法,通过使用多个执行并行算法的处理器相较串行计算更快地解决问题。现代多核处理器的结构能很好的实现并行计算。计算机的发展未来也是并行计算。顺序算法与并行计算顺序算法一般代码块格式如下,顺序算法的每个代码块可能包含多......
  • java实现多线程下载器
    前言:......
  • Linux shell编程学习笔记16:bash中的关联数组
    上一节我们探讨了普通的数组,即使用数字下标来索引数组中不同的元素的数组,也可以称之为索引数组。相比纯粹的数字,字符串不仅能表明含义,也更便于记忆使用,于是就有了关联数组。一、关联数组概述bash从4.0开始支持关联数组,关联数组可以使用可以使用任意的字符串、或者整数作为下标来......
  • 四种常见线程池的原理
    newFixedThreadPool(固定数目线程的线程池)newCachedThreadPool(可缓存线程的线程池)newSingleThreadExecutor(单线程的线程池)newScheduledThreadPool(定时及周期执行的线程池)前三种线程池的构造直接调用ThreadPoolExecutor的构造方法。newSingleThreadExecutorpublicsta......