Linux应用编程---5.多线程的创建以及线程间数据共享

news2025/1/13 7:27:44

Linux应用编程—5.多线程的创建以及线程间数据共享

5.1 多线程的创建

​ 创建多线程,则多次调用pthread_create()函数。创建两个线程,线程1每隔一秒打印字符串:Hello world!,线程2每隔一秒打印字符串:Good moring!编写代码如下:

include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

void * pthread1_function(void *arg);
void * pthread2_function(void *arg);

int main(void)
{
        pthread_t pthread_1, pthread_2;
        int ret = 0;

        ret |= pthread_create(&pthread_1, NULL, pthread1_function, NULL);

        if(0 != ret)
        {
                perror("pthread create.");
                exit(1);
        }

        ret |= pthread_create(&pthread_2, NULL, pthread2_function, NULL);

        if(0 != ret)
        {
                perror("pthread create.");
                exit(1);
        }

        pthread_join(pthread_1, NULL);
        pthread_join(pthread_2, NULL);

        return 0;
}

void * pthread1_function(void *arg)
{
        printf("Pthread1 start running.\n");

        while(1)
        {
                printf("Hello world!\n");
                sleep(1);
        }
    
        return NULL;
}

void * pthread2_function(void *arg)
{
        printf("Pthread2 start running.\n");

        while(1)
        {
                printf("Good moring.\n");
                sleep(1);
        }

        return NULL;
}

​ 运行结果:

image-20221124103959720

图1 代码运行结果
Pthread1 start running.
Hello world!
Pthread2 start running.
Good moring.
Hello world!
Good moring.
Hello world!
Good moring.
Good moring.
Hello world!
Hello world!
Good moring.
Good moring.
Hello world!
Hello world!
Good moring.
Good moring.
Hello world!
Hello world!
Good moring.
Good moring.
Hello world!
Hello world!
Good moring.
^C

​ 可以看出两个线程内的代码同时运行,看上去Hello world!与Good moring.每隔一秒,同时打印出来。

5.2 多线程之间数据共享

​ 定义一个全局变量,分别在两个线程中对其进行++操作以及打印结果。回顾之前父子进程对同一个变量的操作,父子进程在内存中是互相独立的,所以,他们分别增加,两者互相不影响。编写代码测试在线程中对一个全局变量的操作会有什么现象。

#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

void * pthread1_function(void *arg);
void * pthread2_function(void *arg);

int temp = 0;			//定义了全局变量,在线程中对其操作。

int main(void)
{
        pthread_t pthread_1, pthread_2;
        int ret = 0;

        ret |= pthread_create(&pthread_1, NULL, pthread1_function, NULL);

        if(0 != ret)
        {
                perror("pthread create.");
                exit(1);
        }

        ret |= pthread_create(&pthread_2, NULL, pthread2_function, NULL);

        if(0 != ret)
        {
                perror("pthread create.");
                exit(1);
        }

        pthread_join(pthread_1, NULL);
        pthread_join(pthread_2, NULL);

        return 0;
}

void * pthread1_function(void *arg)
{
        printf("Pthread1 start running.\n");

        while(1)
        {
                printf("In pthread1_function, temp = %d.\n", temp++);
                sleep(1);
        }

        return NULL;
}

void * pthread2_function(void *arg)
{
        printf("Pthread2 start running.\n");

        while(1)
        {
                printf("In pthread2_function, temp = %d.\n", temp++);
                sleep(1);
        }

        return NULL;
}

​ 运行结果:

image-20221124215142198

图2 代码运行结果

​ 运行结果可见,对这两个线程来说,temp是同一个变量,第一次,在线程1中为0,在线程2中+1为1;第二次在线程1中+1为2,在线程2中+1为3,依次下去。这是因为对于线程来说,资源是共享的,这一点与进程中的父子进程是有区别的。线程之间资源是共享的,所以实现线程之间的通讯比进程之间通讯要简单。

疑问?如果说多线程是并发执行的,但是temp变量是依次打印的,是不是可以说明线程之间执行有先后顺序呢?

5.3 总结

​ 本次了解了多线程的创建方式,本质还是通过多次调用线程创建函数实现的。线程之间资源贡献,所以对于一个全局变量在多线程之间是可见的,通过这个特点,多线程也更好实现线程之间的通讯。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/149272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【目标检测】Casecade R-CNN论文讲解(超详细版本)

目录&#xff1a;Casecade R-CNN论文讲解一、背景二、简单回顾R-CNN结构2.1 Training阶段2.2 Inference阶段三、论文摘要四、介绍五、关于mismatch问题六、关于单纯增大训练时IoU阈值问题七、相关工作7.1 two-stage7.2 one-stage7.3 multi-stage八、Cascade R-CNN讲解九、总结论…

【NI Multisim 14.0原理图设计基础——元器件分类】

目录 序言 一、元器件分类 &#x1f349;1.电源库 &#x1f349;2.基本元器件库 &#x1f349;3.二极管库 &#x1f349; 4.晶体管库 &#x1f349;5.模拟元器件库 &#x1f349; 6.TTL库 &#x1f349;7.CMOS库 &#x1f349;8.其他数字元器件库 &#x1f349;9.混合…

白帽子VPS 选购指南

本文长期更新&#xff0c;用于记录价格便宜&#xff0c;可以支持个人代码审计测试/部署资产监控任务/hw临时使用等。因为国内云服务器的一些限制&#xff0c;所以文章推荐服务器均为国外服务器&#xff0c;且不需要进行实名认证 PS&#xff1a;不要进行未授权非法活动&#xf…

2、HDFS 入门

一、概述 ​ HDFS&#xff08;Hadoop Distributed File System&#xff09;是分布式文件存储系统&#xff0c;主要用来解决海量数据的存储问题。HDFS比较适合一次写入&#xff0c;多次读出的场景。 NameNode&#xff08;NN&#xff09; 管理HDFS的namespace维护副本策略管理Bl…

黑马学ElasticSearch(二)

目录&#xff1a; &#xff08;1&#xff09;初始ES-安装IK分词器 &#xff08;2&#xff09;IK分词器的拓展和停用词典 &#xff08;3&#xff09;操作索引库-mapping属性 &#xff08;4&#xff09;操作索引库-创建索引库 &#xff08;5&#xff09;操作索引库-查询-删除…

2023浙大MPA项目复试参考

今年浙大MPA项目复试是否会恢复线下面试呢&#xff1f;从形式上来说&#xff0c;常规批复试无论是采取钉钉线上还是现场&#xff0c;似乎都可以顺利完成这一项研究生录取前的必要环节。但在2021年浙大MBA和MPA两个项目顶着风险组织了一次现场面试&#xff0c;只不过是放在了西溪…

EEG-SEED数据集作者的---基线论文阅读和分析

《Investigating Critical Frequency Bands and Channels for EEG-based Emotion Recognition with Deep Neural Networks》 方法&#xff1a; A.预处理根据被试的反应&#xff0c;只选择诱发目标情绪的实验时期进行进一步分析。 将原始脑电图数据降采样至200Hz采样率。目视…

【C语言课堂】 函数精讲

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; 前言&#xff1a; 上期我们详细讲了分支和循环语句&#xff0c;这次我们来讲解函数。说到函数&#xff0c;大家应该不陌生。C语言中的函数是什么样的呢&#xff1f;听我娓娓道来 ~ 目录 ❤️1.何为函数 &a…

目标检测:YOLO V1 思想总结

目标检测&#xff1a;YOLO V1 思想总结YOLO V1Introduction&#xff08;模型介绍&#xff09;Network Design&#xff08;网络设计&#xff09;Backbone&#xff08;骨干网络&#xff09;Grid Cell&#xff08;单元格&#xff09;Loss Function&#xff08;损失函数&#xff09…

信息系统项目管理师考点之进度与成本常见计算

信息系统项目管理师考点之进度与成本常见计算总时差和自由时差区别PERT技术进度管理常见问题解决方案挣值分析成本控制主要工作内容参考链接总时差和自由时差区别 总时差 指一项工作在不影响总工期的前提下所具有的机动时间 总时差 LS - ES LF - EF 自由时差 指一项工作在不…

【STL标准库 范型编程】学习笔记(1):C++学习网站、STL六大部件介绍

目录 简介C++学习网站STL六大部件学习来源结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国…

YUTU

FE: Cortex-R4 处理器 第一个基于 ARMv7-R 体系结构的深层嵌入式实时处理器 BE : Cortex-M3处理器 基于 ARMv7-M体系结构 The YuTu SoC is a Flash memory controller chip, which provides a PCIe Gen 3x4 host interface and 4 channels (up to 8 CEs per channel) Flash in…

【自学C++】C++变量赋值

C变量赋值 C变量赋值教程 变量 的赋值就是给已经定义的变量进行重新设置值的过程&#xff0c;C 中变量的赋值可以单独为单个变量赋值&#xff0c;也可以同时为多个变量赋值。 C变量赋值详解 语法 varname1 value1;参数 参数描述varname1需要赋值的变量。value1需要给变量…

【MySQL系列】Java的JDBC编程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、JCBD背景知识引入 二、安装MySQL数据库驱动包&#xff0c;并且导入到项目中 三、JDBC的使用 3.1 JDBC插入数据操作 3.2 JDBC修改数据操作…

哈希(C++)

C语言总结在这常见八大排序在这作者和朋友建立的社区&#xff1a;非科班转码社区-CSDN社区云&#x1f496;&#x1f49b;&#x1f499;期待hxd的支持哈&#x1f389;&#x1f389;&#x1f389;最后是打鸡血环节&#xff1a;想多了都是问题&#xff0c;做多了都是答案&#x1f…

计算机网络复习之运输层

文章目录ARQ协议停等式ARQ回退n帧的ARQ&#xff08;GBN&#xff09;选择性重传ARQ&#xff08;SR&#xff09;UDP协议TCP协议TCP协议的特点TCP报文段首部格式TCP连接管理TCP可靠传输TCP的流量控制TCP拥塞控制参考拥塞&#xff1a;若对网络中某一资源的需求超过了该资源所能提供…

Jenkins安装

Jenkins安装1、Jenkins简介2、Jenkins安装2.1 安装条件2.2 安装JDK2.2.1 检索可用包2.2.2 安装2.3 下载Jenkins的war包2.4 启动jenkins并测试3、安装maven1、Jenkins简介 Jenkins是一款开源 CI&CD 软件&#xff0c;用于自动化各种任务&#xff0c;包括构建、测试和部署软件…

LeNet5—论文及源码阅读

LeNet5—论文及源码阅读&#x1f42c; 目录: 一、概论二、论文选读三、源码精读四、参考资料 一、概论 LeNet-5是一种经典的卷积神经网络结构&#xff0c;于1998年投入实际使用中。该网络最早应用于手写体字符识别应用中。普遍认为&#xff0c;卷积神经网络的出现开始于LeCu…

蓝牙Inquiry与Inquiry Scan

文章目录一、Inquiry和Inquiry Scan二、Inquiry的三种模式2.1 Inquiry命令2.2 标准Inquiry应答2.3 带RSSI的Inquiry应答2.4 带EIR的Inquiry应答三、Extend Inquiry Response3.1 EIR数据格式3.2 EIR数据注册3.3 EIR数据解析示例3.4 获取对端设备名称的方法四、Inquiry Scan参数一…

推荐系统入门学习(二)【小白入门系列】

搭建你的第一个推荐系统 初识推荐系统 最初的推荐系统&#xff0c;作用是过滤垃圾邮件。今日机器学习算法的发展&#xff0c;朴素贝叶斯、神经网络已然成为了过滤垃圾邮件的好手。但是在30年前&#xff0c;算法还没有如今使用得广泛的时候&#xff0c;“找相同”就成为了过滤…