0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

linux多线程编程实例

jf_09640219 来源:jf_09640219 作者:jf_09640219 2024-02-15 21:16 次阅读

wKgaomXdr8qAXb3zAADgkiVmEsc585.png

之后按r运行程序

进程是程序执行时的一个实例,是担当分配系统资源(CPU时间、内存等)的基本单位。在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程包含了表示进程内执行环境必须的信息,其中包括进程中表示线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno常量以及线程私有数据。进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本、程序的全局内存和堆内存、栈以及文件描述符。在Unix和类Unix操作系统中线程也被称为轻量级进程(lightweight processes),但轻量级进程更多指的是内核线程(kernel thread),而把用户线程(user thread)称为线程。

一、线程同步之互斥量加锁解锁

1. 创建及销毁互斥锁

#include int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); int pthread_mutex_destroy(pthread_mutex_t mutex); // 返回:若成功返回0,否则返回错误编号

要用默认的属性初始化互斥量,只需把attr设置为NULL。

2. 加锁及解锁

#include int pthread_mutex_lock(pthread_mutex_t mutex); int pthread_mutex_trylock(pthread_mutex_t mutex); int pthread_mutex_unlock(pthread_mutex_t mutex); // 返回:若成功返回0,否则返回错误编号

如果线程不希望被阻塞,它可以使用pthread_mutex_trylock尝试对互斥量进行加锁。如果调用pthread_mutex_trylock时互斥量处于未锁住状态,那么pthread_mutex_trylock将锁住互斥量,不会出现阻塞并返回0,否则pthread_mutex_trylock就会失败,不能锁住互斥量,而返回EBUSY。

顾名思义就是加锁某一个线程后,必须要等待此线程执行完后解锁,其他的线程才能够进行。在main函数里面加锁后必须释放锁。

二、什么是死锁

当两个或两个以上的线程在执行过程中,因为争夺资源而造成的一种相互等待的状态,由于存在一种环路的锁依赖关系而永远地等待下去,如果没有外部干涉,他们将永远等待下去,此时的这个状态称之为死锁。

例:创建2个互斥锁,进程1申请得到第一把锁后,同时申请第二把锁;进程2申请得到第二把锁后,同时申请第一把锁。

wKgZomX1nNKAdKL2AACM0l5_73w264.png查找字符串

三、线程条件控制实现线程的同步

例:

定义一个全局变量a,让全局变量a在线程1里面等于3的时候退出线程1,

方法一:加互斥锁

方法二:引入条件量

wKgaomX1nVWALoxdAAPoTCRSR9k220.png

首先在线程1里面调用pthread_cond_wait函数等待条件量的触发,

wKgZomX1na6AbSa9AASqRlEBPDg613.png

在线程2中g_data达到3时,调用函数pthread_cond_signal()来触发条件量,

四、使用宏来静态初始化

在使用互斥变量、条件变量前都必须进行初始化,可以分别置为常量PTHREAD_MUTEX_INITIALIZER(只对静态分配的互斥量)、PTHREAD_COND_INITIALIZER(只对静态分配的条件变量),也可以通过调用pthread_mutex_init、pthread_cond_init函数进行初始化。如果动态地分配互斥量、条件变量(例如通过调用malloc函数),那么在释放内存前需要调用pthread_mutex_destroy,条件变量可以使用pthread_cond_destroy函数对条件变量进行去除初始化(deinitialize)。

动态初始化:

pthread_mutex_t mutex; //dynamic init
pthread_cond_t cond; //dynamic init

主函数中必须:

pthread_mutex_init(&mutex, NULL); //dynamic init
pthread_cond_init(&cond, NULL); //dynamic init

使用宏进行初始化(静态初始化):

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // static init
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // static init


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10991

    浏览量

    206736
  • 多线程编程
    +关注

    关注

    0

    文章

    15

    浏览量

    6663
收藏 人收藏

    评论

    相关推荐

    labview2011自动多线程实例

    提供一个简单的实例,让大家体验到labview多线程编程的优点和labview实现自动多线程的强大功能。
    发表于 10-06 10:06

    Linux多线程编程手册

    Linux多线程编程手册
    发表于 11-07 10:17

    Linux c多线程编程的4个实例

    Linux中最流行的线程机制为LinuxThreads,下面以一个多线程编程实例来介绍该线程库的
    发表于 10-17 09:32

    Linux多线程编程总结

    最近研究MySQL源码,各种锁,各种互斥,好在我去年认真学了《unix环境高级编程》, 虽然已经忘得差不多了,但是学过始终是学过,拿起来也快。写这篇文章的目的就是总结Linux多线程编程
    发表于 07-23 08:17

    Linux c多线程编程的4个实例分享

    Linux c多线程编程的4个实例  在主流的操作系统中,多任务一般都提供了进程和线程两种实现方式,进程享有独立的进程空间,而
    发表于 06-09 04:35

    嵌入式Linux多线程编程

    嵌入式Linux多线程编程-学习资源-华清远见清远见嵌入式学院:清远见嵌入式学院:《嵌入式应用程序设计》——第5 章 嵌入式Linux 多线程
    发表于 11-05 06:54

    如何对Linux系统多线程进行编程

    Linux系统编程第07期:多线程编程入门 6年嵌入式开发经验,在多家半导体...
    发表于 12-23 08:08

    linux多线程编程课件

    电子发烧友为您提供了linux多线程编程课件,希望对您学习 linux 有所帮助。部分内容如下: *1、多线程模型在单处理器模型和多处理器系
    发表于 07-10 11:58 0次下载

    linux多线程编程开发

    本文中我们针对 Linux多线程编程的主要特性总结出 5 条经验,用以改善 Linux 多线程编程
    发表于 12-26 14:24 55次下载
    <b class='flag-5'>linux</b><b class='flag-5'>多线程</b><b class='flag-5'>编程</b>开发

    linux多线程编程技术

    (process)中只允许有一个线程,这样多线程就意味着多进程。现在,多线程技术已经被许多操作系统所支持,包括Windows/NT,当然,也包括Linux。 为什么有了进程的概念后,还
    发表于 10-24 16:01 5次下载

    什么是多线程编程?多线程编程基础知识

    摘要:多线程编程是现代软件技术中很重要的一个环节。要弄懂多线程,这就要牵涉到多进程。本文主要以多线程编程以及
    发表于 12-08 16:30 1.2w次阅读

    Linux下的多线程编程

    的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。  下面我们先来尝试编写一个简单的多线程程序。2 简单的多线程编程  
    发表于 04-02 14:43 474次阅读

    嵌入式linux多线程编程实验,嵌入式Linux多线程编程-学习资源-华清远见.PDF

    嵌入式Linux多线程编程-学习资源-华清远见清远见嵌入式学院:清远见嵌入式学院:《嵌入式应用程序设计》——第5 章 嵌入式Linux 多线程
    发表于 11-02 13:36 7次下载
    嵌入式<b class='flag-5'>linux</b><b class='flag-5'>多线程</b><b class='flag-5'>编程</b>实验,嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>多线程</b><b class='flag-5'>编程</b>-学习资源-华清远见.PDF

    Linux多线程编程的知识点

    Hello、Hello大家好,我是木荣,今天我们继续来聊一聊Linux多线程编程中的重要知识点,详细谈谈多线程中同步和互斥机制。
    发表于 04-26 17:27 481次阅读
    <b class='flag-5'>Linux</b>中<b class='flag-5'>多线程</b><b class='flag-5'>编程</b>的知识点

    mfc多线程编程实例

    (图形用户界面)应用程序的开发。在这篇文章中,我们将重点介绍MFC中的多线程编程多线程编程在软件开发中非常重要,它可以实现程序的并发执行,提高程序的效率和响应速度。MFC提供了丰富
    的头像 发表于 12-01 14:29 506次阅读