Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux C 编程——多线程

Linux C 编程——多线程

作者头像
felixzhao
发布于 2019-01-31 08:21:48
发布于 2019-01-31 08:21:48
6.8K00
代码可运行
举报
文章被收录于专栏:null的专栏null的专栏
运行总次数:0
代码可运行

线程是计算机中独立运行的最小单位,运行时占用很少的系统资源。与多进程相比,多进程具有多进程不具备的一些优点,其最重要的是:对于多线程来说,其能够比多进程更加节省资源。

1、线程创建

在Linux中,新建的线程并不是在原先的进程中,而是系统通过一个系统调用clone()。该系统copy了一个和原先进程完全一样的进程,并在这个进程中执行线程函数。

在Linux中,通过函数pthread_create()函数实现线程的创建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

其中:

  • thread表示的是一个pthread_t类型的指针;
  • attr用于指定线程的一些属性;
  • start_routine表示的是一个函数指针,该函数是线程调用函数;
  • arg表示的是传递给线程调用函数的参数。

当线程创建成功时,函数pthread_create()返回0,若返回值不为0则表示创建线程失败。对于线程的属性,则在结构体pthread_attr_t中定义。

线程创建的过程如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <malloc.h>

void* thread(void *id){
        pthread_t newthid;

        newthid = pthread_self();
        printf("this is a new thread, thread ID is %u\n", newthid);
        return NULL;
}

int main(){
        int num_thread = 5;
        pthread_t *pt = (pthread_t *)malloc(sizeof(pthread_t) * num_thread);

        printf("main thread, ID is %u\n", pthread_self());
        for (int i = 0; i < num_thread; i++){
                if (pthread_create(&pt[i], NULL, thread, NULL) != 0){
                        printf("thread create failed!\n");
                        return 1;
                }
        }
        sleep(2);
        free(pt);
        return 0;
}

在上述代码中,使用到了pthread_self()函数,该函数的作用是获取本线程的线程ID。在主函数中的sleep()用于将主进程处于等待状态,以让线程执行完成。最终的执行效果如下所示:

那么,如何利用arg向子线程传递参数呢?其具体的实现如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <malloc.h>

void* thread(void *id){
        pthread_t newthid;

        newthid = pthread_self();
        int num = *(int *)id;
        printf("this is a new thread, thread ID is %u,id:%d\n", newthid, num);
        return NULL;
}

int main(){
        //pthread_t thid;
        int num_thread = 5;
        pthread_t *pt = (pthread_t *)malloc(sizeof(pthread_t) * num_thread);
        int * id = (int *)malloc(sizeof(int) * num_thread);

        printf("main thread, ID is %u\n", pthread_self());
        for (int i = 0; i < num_thread; i++){
                id[i] = i;
                if (pthread_create(&pt[i], NULL, thread, &id[i]) != 0){
                        printf("thread create failed!\n");
                        return 1;
                }
        }
        sleep(2);
        free(pt);
        free(id);
        return 0;
}

其最终的执行效果如下图所示:

如果在主进程提前结束,会出现什么情况呢?如下述的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <malloc.h>

void* thread(void *id){
        pthread_t newthid;

        newthid = pthread_self();
        int num = *(int *)id;
        printf("this is a new thread, thread ID is %u,id:%d\n", newthid, num);
        sleep(2);
        printf("thread %u is done!\n", newthid);
        return NULL;
}

int main(){
        //pthread_t thid;
        int num_thread = 5;
        pthread_t *pt = (pthread_t *)malloc(sizeof(pthread_t) * num_thread);
        int * id = (int *)malloc(sizeof(int) * num_thread);

        printf("main thread, ID is %u\n", pthread_self());
        for (int i = 0; i < num_thread; i++){
                id[i] = i;
                if (pthread_create(&pt[i], NULL, thread, &id[i]) != 0){
                        printf("thread create failed!\n");
                        return 1;
                }
        }
        //sleep(2);
        free(pt);
        free(id);
        return 0;
}

此时,主进程提前结束,进程会将资源回收,此时,线程都将退出执行,运行结果如下所示:

2、线程挂起

在上述的实现过程中,为了使得主线程能够等待每一个子线程执行完成后再退出,使用了free()函数,在Linux的多线程中,也可以使用pthread_join()函数用于等待其他线程,函数的具体形式为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int pthread_join(pthread_t thread, void **retval);

函数pthread_join()用来等待一个线程的结束,其调用这将被挂起。

一个线程仅允许一个线程使用pthread_join()等待它的终止。

如需要在主线程中等待每一个子线程的结束,如下述代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <malloc.h>

void* thread(void *id){
        pthread_t newthid;

        newthid = pthread_self();
        int num = *(int *)id;
        printf("this is a new thread, thread ID is %u,id:%d\n", newthid, num);
        free(3);
        printf("thread %u is done\n", newthid);
        return NULL;
}

int main(){
        int num_thread = 5;
        pthread_t *pt = (pthread_t *)malloc(sizeof(pthread_t) * num_thread);
        int * id = (int *)malloc(sizeof(int) * num_thread);

        printf("main thread, ID is %u\n", pthread_self());
        for (int i = 0; i < num_thread; i++){
                id[i] = i;
                if (pthread_create(&pt[i], NULL, thread, &id[i]) != 0){
                        printf("thread create failed!\n");
                        return 1;
                }
        }
        for (int i = 0; i < num_thread; i++){
                pthread_join(pt[i], NULL);
        }
        free(pt);
        free(id);
        return 0;
}

最终的执行效果如下所示:

注:在编译的时候需要链接libpthread.a: g++ xx.cc -lpthread -o xx

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年03月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
最新Win10专业版系统下载|Win10 22H2纯净版安装教程|UEFI引导+U盘分区优化+安全加固(含官方镜像文件)
Windows 10 是微软推出的一款具有重要影响力的操作系统。它在易用性和安全性上有显著提升,对云服务、智能移动设备等新技术进行融合,还优化支持了固态硬盘等硬件。其特点丰富,有 Cortana 个人助理、Edge 浏览器、多桌面和任务视图等。开始菜单回归经典且具高度可定制性,搜索栏功能强大。从 Windows Store 下载的应用可窗口化运行。
万里顾一诚
2025/06/09
5.9K0
最新Win10专业版系统下载|Win10 22H2纯净版安装教程|UEFI引导+U盘分区优化+安全加固(含官方镜像文件)
WIN10系统开机一个WIFI都找不到,网络适配器里没有WLAN驱动,连接不了网络问题【耗时3天测试10多种方法】
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157381.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/08
9.3K0
WIN10系统开机一个WIFI都找不到,网络适配器里没有WLAN驱动,连接不了网络问题【耗时3天测试10多种方法】
win10网络设置中没有wlan选项怎么办
小伙伴你们知道怎么解决win10网络设置没有wlan选项的方法吗?要是不知道的话,嘻嘻~那么你们问小编我就对了,因为小编前些这好学习了这各方面的内容,现在就来告诉你们解决win10网络设置中没有wlan选项的方法哈。
牛肉面
2021/04/06
7.4K0
Win10 网络重置引起的“Wifi消失”及解决方案
有一说一,今天wifi连不上,折腾了会果断把网络重置了。和以前一样重启开机没有显示wifi图标,按道理再重置一次重新开机就好了,但是这次没有效果,使用cmd命令重置重启也无效,故记一下最后解决的办法…
2Broear
2024/03/12
6230
Win10 网络重置引起的“Wifi消失”及解决方案
关于笔记本电脑WiFi(WLAN)图标(标志)异常消失断开解决方案
除上面这种方法还有2种方法就是系统自带的诊断网络问题,用该功能或许也能解决上述情况
Insecure Fluoxetine
2024/04/08
1.1K0
关于笔记本电脑WiFi(WLAN)图标(标志)异常消失断开解决方案
win10以太网怎么连接 win10以太网怎么连接的解决办法
使用win10的小伙伴们经常会发现以太网连接不上,那么我们该如何设置win10以太网呢?接下来小编带大家一起来看看该怎么解决。 win10以太网怎么连接的解决办法 第一步:点击右下角的网络图标,打开网
用户8002245
2020/12/21
12.4K0
win10 本地适配器不支持重要的低能耗控制器状态
在事件查看器看到警告 本地适配器不支持重要的低能耗控制器状态,因此不支持外设模式。所需的最小支持状态掩码为 0x491f7fffff,获得 0x1fffffff。低能耗外设角色功能将不可用 然后设备出现未响应
林德熙
2022/08/12
1.9K0
win10如何添加linux开机引导,win10 linux 双系统怎么设置开机引导「建议收藏」
当然是下载Ubuntu了,我是在Ubuntu官网下载的原生版本,我下载的是Ubuntu最新版本15.04。没有选择国人修改过的kylin版本。kylin好不好我完全不懂,只是习惯性的觉得国人做系统不放心,就连修改下我都不放心。
全栈程序员站长
2022/09/15
7.8K0
在WIN7系统的笔记本上建立WIFI热点「建议收藏」
    前置条件:右键“我的电脑”——“属性”——“设备管理器”——“网络适配器”查看是否有 Microsoft Virtual WiFi Miniport Adapter这一项,假设安装的是WIN 7系统,一般都会有这一项。假设没有。能够在网上查查怎样安装上这一项,或者你的虚拟WiFi网卡还没有启用起来运行以下的启用命令去启动。 開始菜单中去找到命令提示符,右键——以管理员权限方式打开——输入以下的命令:
全栈程序员站长
2022/01/25
1K0
Win10没有以太网图标如何找回?以太网适配器不见了怎么恢复?
Win10以太网适配器不见了怎么恢复?以太网其实就是Win7系统中常说的“本地连接”假若用户发现网络适配器中的以太网适配器图标不见了,可以在设备管理器中添加一些这类适配器,具体过程请看下文。
黑泽君
2018/10/11
13K0
关于win10系统安装VMware12Pro后,win10系统的 控制面板\网络和 Internet\网络连接\更改适配器选项卡中 没有虚拟网卡VMnet1和VMnet8图标,该如何把他们显示出来呢?
安装VMware12Pro后,PC主机通过命令行:ipconfig/all ,查看发现没有 VMnet1 和VMnet8 。
黑泽君
2018/10/11
3.7K0
win10的一些问题解决
出现的场景:一次更新win10时,更新完成后发现扫描不到无线网了,查看适配器后发现没有无线网WLAN适配器,继续查看驱动,发现无线网的驱动有了一个黄色的感叹号,表示出现故障。
时光潜流
2023/10/22
3950
win10的一些问题解决
使用无线网卡连接网络,默认网关不可用的解决。
工作原因不得不使用台式机,最近挪了窝,不高兴在家横七竖八的拉网线,索性就用了一个USB的免驱无线网卡,通过这个小东西进行联网。而这几天发现网络三番两次的掉线,通过系统修复,提示默认网关不可用,系统自动修复好了以后,但凡网络流量大一些,就会再次掉线,气死我了,总这么修复也不是个办法啊。着手解决它,修复步骤如下。
世纪访客
2018/08/02
3.7K0
使用无线网卡连接网络,默认网关不可用的解决。
win10封装系统(sc封装)
大家都知道Win10系统是微软最新发布的具有划时代意义的新一代操作系统,担负着振兴微软的大任,凭借卓越的性能和流畅的用户体验赢得了广大用户的认可和信任,市场占有率那是芝麻开花节节高啊,不过作为装机维修的技术员同行们肯定想知道如何封装Win10操作系统,从而为我们的日常装机工作带来便利,不过据爱学府软件园了解到目前网络上几乎找不到比较详细好用且具备学习价值的Win10系统封装教程,针对这一问题,爱学府软件园小编本着乐善好施的菩萨心肠并且经历了两个不眠之夜的痛苦煎熬为大家悉心制作了一份目前网络上迄今为止最为详细好用且极具参考学习价值的【Win10系统封装教程】,本教程由浅入深的介绍了Win10系统封装的整个过程,从虚拟机的建立,到虚拟磁盘的分区,母盘系统的安装以及虚拟机BIOS的设置还有ES封装工具和SC封装工具的使用均有详细介绍,大家可以通过本教程举一反三,融会贯通的学会Win7 或者 Win8 系统的封装,相信会给大家的系统封装学习予以参考少走弯路,希望大家能够喜欢,好了,废话少说,下面是Win10系统封装教程的详细操作步骤:
全栈程序员站长
2022/07/29
3.3K0
win10将WLAN网络共享给以太网
说明:同时有A、B两台电脑,A电脑通过无线网卡连接wifi,将网络共享给A电脑的以太网口,B电脑有线网卡连接A电脑的以太网口实现上网功能。 实现方法 1.1 点击无线网络图标,打开网络和共享中心,如下图所示 image.png 1.2 打开后进入如下界面,点击WLAN,更改适配器选项 image.png 1.3 右键点击WLAN,选择属性,打开如下界面所示 image.png image.png 1.4 在WLAN属性对话框中点击上方的共享,然后勾选 “允许其他网络用户通过此计算机的Internet连接来连
云深无际
2020/08/12
22K0
Thinkbook16+在ubuntu下编译无线网卡驱动、替换Grub的默认主题等等
由于 Thinkbook16+ 原装的无线网卡是瑞昱的 RTL8852,装上 ubuntu 22.04 之后会因为没有驱动而无法使用 wifi 功能,这个问题一度困扰了我好长时间,由于没有网线,在此期间只能用手机的 USB 热点共享功能把手机当成 ubuntu 的无线网卡来用。
知识分子没文化
2023/07/01
2K0
Thinkbook16+在ubuntu下编译无线网卡驱动、替换Grub的默认主题等等
华硕怎么安装linux系统教程,华硕笔记本系统如何安装win10和linux 双系统[通俗易懂]
稍微了整理了一下win10和linux双系统的安装教程,第一个选项是进入U盘linux live,等等) 第一点设置boot挂载点。
全栈程序员站长
2022/09/15
6.5K0
春节来临:Windows & Mac 电脑设置自动开机、永不休眠、远程解决方案与远程办公指南
春节将至,对于许多人来说,这不仅是一段与家人团聚的美好时光,同时也可能是需要兼顾远程工作的关键时期。为了帮助大家在春节期间实现设备高效管理和远程办公,本文将从以下几个方面进行详细讲解:
猫头虎
2025/01/18
6810
春节来临:Windows & Mac 电脑设置自动开机、永不休眠、远程解决方案与远程办公指南
VMWare安装Win10虚拟机详细教程
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/148812.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/07
3.9K0
VMWare安装Win10虚拟机详细教程
win10台式机一根网线连接笔记本wifi网络
目前情况:win10笔记本电脑有无线网,win10台式机没法连接无线,现在有一条网线。
全栈程序员站长
2022/09/13
2.5K0
推荐阅读
最新Win10专业版系统下载|Win10 22H2纯净版安装教程|UEFI引导+U盘分区优化+安全加固(含官方镜像文件)
5.9K0
WIN10系统开机一个WIFI都找不到,网络适配器里没有WLAN驱动,连接不了网络问题【耗时3天测试10多种方法】
9.3K0
win10网络设置中没有wlan选项怎么办
7.4K0
Win10 网络重置引起的“Wifi消失”及解决方案
6230
关于笔记本电脑WiFi(WLAN)图标(标志)异常消失断开解决方案
1.1K0
win10以太网怎么连接 win10以太网怎么连接的解决办法
12.4K0
win10 本地适配器不支持重要的低能耗控制器状态
1.9K0
win10如何添加linux开机引导,win10 linux 双系统怎么设置开机引导「建议收藏」
7.8K0
在WIN7系统的笔记本上建立WIFI热点「建议收藏」
1K0
Win10没有以太网图标如何找回?以太网适配器不见了怎么恢复?
13K0
关于win10系统安装VMware12Pro后,win10系统的 控制面板\网络和 Internet\网络连接\更改适配器选项卡中 没有虚拟网卡VMnet1和VMnet8图标,该如何把他们显示出来呢?
3.7K0
win10的一些问题解决
3950
使用无线网卡连接网络,默认网关不可用的解决。
3.7K0
win10封装系统(sc封装)
3.3K0
win10将WLAN网络共享给以太网
22K0
Thinkbook16+在ubuntu下编译无线网卡驱动、替换Grub的默认主题等等
2K0
华硕怎么安装linux系统教程,华硕笔记本系统如何安装win10和linux 双系统[通俗易懂]
6.5K0
春节来临:Windows & Mac 电脑设置自动开机、永不休眠、远程解决方案与远程办公指南
6810
VMWare安装Win10虚拟机详细教程
3.9K0
win10台式机一根网线连接笔记本wifi网络
2.5K0
相关推荐
最新Win10专业版系统下载|Win10 22H2纯净版安装教程|UEFI引导+U盘分区优化+安全加固(含官方镜像文件)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验