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

    文章

    11295

    浏览量

    209348
  • 多线程编程
    +关注

    关注

    0

    文章

    17

    浏览量

    6687
收藏 人收藏

    评论

    相关推荐

    Linux多线程编程手册

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

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

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

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

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

    嵌入式Linux多线程编程

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

    java多线程编程实例 (源程序)

    java多线程编程实例 import java.awt.*;import javax.swing.*; public class CompMover extends Object { 
    发表于 10-22 11:48 0次下载

    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线程编程

    9.2 Linux线程编程 9.2.1 线程基本编程 这里要讲的线程相关操作都是用户空间中的
    发表于 10-18 15:55 3次下载

    linux多线程编程威廉希尔官方网站

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

    mfc多线程编程实例及代码,mfc多线程间通信介绍

    摘要:本文主要以MFC多线程为中心,分别对MFC多线程实例、MFC多线程之间的通信展开的一系列研究,下面我们来看看原文。
    发表于 12-08 15:23 1.8w次阅读
    mfc<b class='flag-5'>多线程</b><b class='flag-5'>编程</b><b class='flag-5'>实例</b>及代码,mfc<b class='flag-5'>多线程</b>间通信介绍

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

    摘要:多线程编程是现代软件威廉希尔官方网站 中很重要的一个环节。要弄懂多线程,这就要牵涉到多进程。本文主要以多线程编程以及
    发表于 12-08 16:30 1.3w次阅读

    关于Linux多线程编程威廉希尔官方网站 学习总结

    Linux多线程编程威廉希尔官方网站 作为一个IT人员,不断的学习和总结是我们这个职业习惯,所以我会将每个阶段的学习都会通过一点的总结来记录和检测自己的学习效果,今天为大家总结了关于Linux
    发表于 04-22 03:12 2202次阅读
    关于<b class='flag-5'>Linux</b>下<b class='flag-5'>多线程</b><b class='flag-5'>编程</b>威廉希尔官方网站
学习总结

    Linux下的多线程编程

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

    Linux多线程编程的知识点

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

    mfc多线程编程实例

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