linux下的POSIX C 多线程编程 helloworld

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情
#include<pthread.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>

#define MAX 10

pthread_t thread[2];
pthread_mutex_t mut;
int number = 0;
int i;

void* thread1( void *param )
{
        printf( "thread1: I'm thread 1\n " );
        for( i = 0; i < MAX; i++ )
        {
                printf( "thread1: number = %d\n", number );
                pthread_mutex_lock( &mut );
                        ++number;
                pthread_mutex_unlock( &mut );
                sleep( 2 );
        }

        printf( "thread1: 主函数等我完成任务吗? \n " );
        pthread_exit( NULL );

        return ( void* )0;
}

void* thread2( void* param )
{
        printf( "thread2: I'm thread 2\n" );
        for( i = 0; i < MAX; i++ )
        {
                printf( "thread2: number = %d\n", number );
                pthread_mutex_lock( &mut );
                        ++number;
                pthread_mutex_unlock( &mut );
                sleep( 3 );
        }

        printf( "thread2: 主函数在等我完成任务吗? \n" );
        pthread_exit( NULL );

        return ( void* )0;
}

void thread_create( void )
{
        int temp;
        memset( &thread, 0, sizeof( thread ) );

        // 创建线程1
        if( ( temp = pthread_create( &thread[0], NULL, thread1, NULL ) ) != 0 )
        {
                printf( "线程1创建失败!\n" );
        }
        else
        {
                printf( "线程1被创建\n" );
        }

        // 创建线程2
        if( ( temp = pthread_create( &thread[1], NULL, thread2, NULL ) ) != 0 )
        {
                printf( "线程2创建失败!\n" );
        }
        else
        {
                printf( "线程2被创建\n" );
        }
}

void thread_wait( void )
{
        // 主函数等待线程1结束
        if ( thread[0] != 0 )
        {
                pthread_join( thread[0], NULL );
                printf( "线程1已经结束\n" );
        }

        // 主函数等待线程2结束
        if ( thread[1] != 0 )
        {
                pthread_join( thread[1], NULL );
                printf( "线程2已经结束\n" );
        }
}

int main()
{
        // 初始化互斥锁
        pthread_mutex_init( &mut, NULL );

        printf( "我是main函数,正在创建线程...\n" );
        thread_create();

        printf( "我是主函数,正在等待线程完成任务...\n" );
        thread_wait();

        printf( "main函数已退出\n" );
        return 0;
}

// main output1 

我是main函数,正在创建线程...
线程1被创建
线程2被创建
我是主函数,正在等待线程完成任务...
thread1: I'm thread 1
 thread2: I'm thread 2
thread1: number = 0
thread2: number = 0
thread1: number = 2
thread2: number = 3
thread1: number = 4
thread2: number = 5
thread1: number = 6
thread1: number = 7
thread2: number = 8
thread1: number = 9
thread2: number = 10
thread1: 主函数等我完成任务吗?
 线程1已经结束
thread2: 主函数在等我完成任务吗?
线程2已经结束
main函数已退出

// main output2

我是main函数,正在创建线程...
线程1被创建
线程2被创建
我是主函数,正在等待线程完成任务...
thread1: I'm thread 1
 thread1: number = 0
thread2: I'm thread 2
thread2: number = 1
thread1: number = 2
thread2: number = 3
thread1: number = 4
thread2: number = 5
thread1: number = 6
thread1: number = 7
thread2: number = 8
thread1: number = 9
thread2: number = 10
thread1: 主函数等我完成任务吗?
 线程1已经结束
thread2: 主函数在等我完成任务吗?
线程2已经结束
main函数已退出


g++编译命令如下: g++ -lpthread -o helloworld.out helloworld.cpp


问题:两个线程共同完成任务,但是对于 共享变量 i 没有互斥加锁操作, 所以以上多线程程序还是存在问题的!


为了达到兼容可移植的目的,POSIX给出了C语言下的多线程编程库 pthread,具体的学习资料请参考一下链接

http://blog.csdn.net/future_fighter/article/details/3865071

http://blog.csdn.net/sunboy_2050/article/details/5921003

http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/index.html

Linux C语言TCP服务器开发:从Socket编程到并发处理实战 Socket编程是网络通信的基础,它通过操作系统提供的接口,实现了应用程序与网络协议栈之间的交互。其核心原理在于将复杂的网络数据包收发抽象为文件描述符的读写操作,从而简化了网络应用的开发。这一技术为构建高性能、可靠的网络服务提供了底层支持,广泛应用于Web服务器、游戏服务器、即时通讯等场景。本文以Linux环境下C语言实现TCP服务器为例,深入解析了从创建监听套接字、绑定地址端口,到处理连接请求和数据收发的完整流程。针对实际开发中的常见挑战,文章重点探讨了TCP粘包与拆包问题的解决方案,并对比了多进程、多线 阅读详情

相关推荐

Linux进程间通信实战指南:选型策略与避坑经验

进程间通信是操作系统协调多个独立进程协同工作的核心机制,其原理在于通过内核提供的多种数据交换与同步方法,实现进程间的信息传递与资源共享。这项技术的核心价值在于打破进程间的信息孤岛,构建高效、可靠的系统协作基础,广泛应用于服务解耦、数据共享、任务并行等场景。本文聚焦于Linux环境下的IPC实践,深入剖析了管道、共享内存、消息队列等关键机制,并结合实战场景,提供了从选型决策到性能调优的完整解决方案,帮助开发者规避常见陷阱,构建稳健的分布式或高并发应用。

weixin_33970449的博客 384

POSIX标准个人版

POSIX标准的个人版,来自opengroup.org。

POSIX操作系统编程指南中文版

POSIX操作系统编程指南中文版,关于Linux编程的介绍。

系统调用、POSIX、C库、系统命令和内核函数

大部分介绍Linux内核的书籍都没有仔细说明系统调用,这应该算是一个失误。内核发展到现在,我们实际需要的系统调用现在已经十分完美,从这个意义上来说,再耗费宝贵的时间去研究系统调用的实现是毫无意义的事情。 然而,对于希望能够对内核有更深理解的我们来说,仔细研究少量系统调用仍是十分值得的。这样就有机会初步了解一些概念,并可以趁机详细了解一下内核编程的特点,就像系统调用本身在应用程序和内核间的桥梁作用一样,学习并理解它也是我们走向内核的一个很好的过渡。 5.1 系统调用概述 一个稳定运行的Linux操作系统

生活需要深度 2922

ISO C 与POSIX 的关系

我们经常会看到”ISO C “以及 “POSIX 接口”,那么究竟什么是ISO C,究竟什么POSIX,它们之间有什么联系与区别呢? ISO C就是 International Organization for Standardization 国际标准化组织为了提高C语言的移植性而设立的C语言标准,里面包含两部分:C语法及语义;C标准函数库。其中只是定义了C标准函数库的函数原型、函数功能,而...

jmhIcoding 3835

两分钟搞定POSIX

在网上查到对于posix的介绍,来自《Linux内核设计与实现(第2版)》的第5章,就这部分来看,这本书估计不错。 一般情况下,应用程序通过应用编程接口(API)而不是直接通过系统调用来编程。这点很重要,因为应用程序使用的这种编程接口实际上并不需要和内核 提供的系统调用对应。一个API定义了一组应用程序使用的编程接口。它们可以实现成一个系统调用,也可以通过调用多个系统调用来实现,而完全不使用任何系 统调用也不存在问题。实际上,API可以在各种不同的操作系统上实现,给应用程序提供完全相同的接口,而它们本身.

Jiangtagong的博客 461

POSIX C & ANSI C

以下部分转载自:http://blog.csdn.net/skylj0209/article/details/3071507ANSI C 这一标准是 ANSI(美国国家标准局)于 1989 年制定的 C 语言标准。 后来被 ISO(国际标准化组织)接受为标准,因此也称为 ISO C。 ANSI C 的目标是为各种操作系统上的 C 程序提供可移植性保证,而不仅仅限于 UNIX。 该标准不

Echo Of Souls 711

线程概述——基于POSIX的C语言多线程基础知识(一)

在多处理器共享内存的架构中(如:对称多处理系统SMP),线程可以用于实现程序的并行性。历史上硬件销售商实现了各种私有版本的多线程库,使得软件开发者不得不关心它的移植性。对于UNIX系统,IEEE POSIX 1003.1标准定义了一个C语言多线程编程接口。依附于该标准的实现被称为POSIX theads 或 Pthreads。   Pthreads API主要包括三大类函数:线程管理(Thre

judy1017的专栏 1294

Linux下C语言的多线程编程学习

Linux下C语言的多线程编程学习 一、首先,简单了解一下多线程,从耳熟能详的fork()、pthread中理点头绪出来,然后自己写一个简单的来增加一下信心。 1、Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连 接时需要使用库libpthread.a。因此,后面的编译必须在选项中加入 -lpthread

linenlkystr的专栏 629

Linux C语言网络编程:从Socket到epoll的并发服务器实战

网络编程是构建分布式系统和网络应用的核心技术,其基础在于理解操作系统提供的进程间通信机制。在Linux环境下,系统调用和内核机制为网络通信提供了最直接的访问途径。其核心原理围绕Socket API展开,通过创建、绑定、监听和连接等系统调用,实现不同主机间的数据交换。这项技术的核心价值在于能够以接近硬件和操作系统内核的方式,实现对网络通信的精细控制和高性能处理,尤其适合开发需要极致性能和高并发的服务器程序,如Web服务器、实时通信服务和分布式系统节点。在实际应用中,开发者需要根据场景选择合适的并发模型,例如多

weixin_34007886的博客 692

Linux多线程与多进程通信机制全解析:从同步原语到IPC实战

并发编程是现代软件开发的基石,其核心在于如何让多个执行单元高效、安全地协同工作。从原理上讲,这涉及到对共享资源的访问控制与数据交换机制的设计。线程作为进程内的轻量级执行流,天然共享内存空间,其通信本质是同步问题,通过互斥锁、条件变量、信号量等同步原语来防止数据竞争和死锁,从而保障数据访问的正确性,这是构建高性能、高可靠服务端程序的关键技术。进程作为独立的执行实体,拥有隔离的地址空间,其通信(IPC)则需借助内核提供的管道、消息队列、共享内存等机制在隔离空间间搭建数据桥梁,尤其在微服务、分布式系统等架构中至关

weixin_33850015的博客 499

Ubuntu系统下C语言的编译及makefile的应用

本文主要叙述了Ubuntu在Windows10环境下的安装,Linux系统下编写C语言程序、运行C语言程序,及Makefile文件编写规则。 目录 文章目录Ubuntu的安装1.Linux简介2.虚拟机的安装2.1 虚拟机的选择2.2 VMware Workstation pro安装常见问题2.3 Ubuntu 的安装Ubuntu系统下编写C语言程序1.C语言环境的安装2.编写HelloWorld程序Makefile的应用1.Makefile简介2.实例 Ubuntu的安装 1.Linux简介 ​ Linu

江南烟浓雨的博客 835

❤️你见过Linux下内核的应用程序hellowolrd吗?你说你会用c语言写hellowolrd?我不信❤️

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码

m0_46217142的博客 3873

从零实现C++ Socket服务器:掌握TCP/IP、多线程与epoll核心技术

网络编程是现代软件开发的基石,其核心在于理解操作系统如何通过Socket抽象提供进程间通信能力。Socket本质上是文件描述符,遵循“一切皆文件”的Unix哲学,开发者通过读写操作实现网络数据传输。TCP/IP协议栈确保了可靠、有序的字节流通信,其三次握手、流量控制等机制是构建稳定网络服务的基础。在工程实践中,高并发处理是关键挑战,传统多线程模型虽直观但资源开销大,而I/O多路复用技术(如select、poll、epoll)通过单线程监控多个连接,显著提升吞吐量,成为高性能服务器标配。针对实际开发中的粘包拆

weixin_34331102的博客 387

应届生技术选型指南:C/C++/Python/Java四大语言对比与学习路径

编程语言是软件开发的基石,其核心在于将人类逻辑转化为机器可执行的指令。不同语言的设计哲学与实现原理决定了其性能、抽象层级和适用场景。从底层原理看,C语言通过直接内存操作和指针提供对硬件的极致控制,是理解计算机系统根基的关键;C++在保持高性能的同时引入面向对象和泛型编程,实现了性能与抽象的平衡;Python通过解释执行和动态类型大幅提升开发效率,成为数据科学和快速原型验证的利器;Java则凭借JVM虚拟机和垃圾回收机制,构建了稳定、跨平台的企业级应用生态。这些语言的技术价值体现在各自的核心应用领域:C/C+

weixin_34406086的博客 1066

i.MX6ULL嵌入式Linux Socket编程实战:多连接处理与健壮性设计

Socket编程是网络通信的底层接口,它基于TCP/IP协议栈,为设备间数据传输提供了基础。其核心原理是通过文件描述符抽象网络连接,实现数据的可靠或不可靠传输。在嵌入式Linux开发中,掌握Socket编程对于构建稳定、高效的物联网设备至关重要,尤其在资源受限的处理器如i.MX6ULL上。其技术价值在于能够实现设备与云端、控制端之间的实时数据交换,是远程监控、数据采集和设备控制等应用场景的基石。本文聚焦于嵌入式环境下的Socket编程实战,深入探讨如何利用I/O多路复用技术高效管理多客户端连接,并设计健壮的

weixin_33843947的博客 381

C/C++服务器开发入门:从请求响应模型到高并发架构实践

服务器本质上是处理网络请求的程序,其核心是请求-响应模型。理解这一模型是掌握网络编程的基础。从原理上看,服务器通过监听特定端口,按照预定规则处理数据包来实现通信。其技术价值在于能够高效、稳定地处理海量并发连接,这是支撑现代互联网应用的关键。常见的应用场景包括Web服务、API接口、实时通信等。为了实现高并发,服务器演化出了多种网络模型,例如多线程模型和事件驱动模型。多线程模型通过为每个连接创建独立线程来处理并发,但面临线程创建开销大和C10K问题的挑战。事件驱动模型则通过IO多路复用技术,使用单个或少量线程

weixin_34341117的博客 415

C++ TCP网络编程实战:从Socket基础到可复用模块封装

TCP(传输控制协议)作为网络通信的核心基础,提供了可靠的、面向连接的字节流传输服务。其可靠性体现在通过序列号、确认应答和重传机制保证数据有序、无差错送达,而面向连接的特性则通过三次握手建立连接、四次挥手断开连接来管理通信会话。在工程实践中,TCP的字节流特性要求开发者必须在应用层设计协议来处理数据边界问题,例如采用长度前缀法。这些原理直接决定了网络应用的稳定性和性能,是构建游戏服务器、物联网平台和企业级中间件的关键技术基础。本文以C++为例,深入讲解TCP通信模块的实现细节,涵盖socket创建、bind

weixin_30607659的博客 419

Linux系统程序设计核心:文件I/O、进程管理与信号处理详解

系统调用是操作系统为用户程序提供服务的核心接口,它实现了用户空间与内核空间的交互,是理解操作系统工作原理的基础。通过系统调用,程序可以请求内核执行文件操作、进程控制、网络通信等底层功能,从而实现对硬件资源的直接管理。掌握系统调用的原理与使用,对于开发高性能、高可靠性的系统软件至关重要,尤其在服务器开发、嵌入式系统和性能优化等场景中。本文聚焦Linux系统程序设计,深入探讨文件描述符、进程创建与通信机制,并结合fork()、exec()等热词,解析写时复制、僵尸进程等核心概念,帮助开发者从底层理解Linux

weixin_30399155的博客 472
上一篇: java垃圾回收 GC算法
下一篇: session 与 cookie
辉仔
博客等级 码龄16年 325粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值