【linux服务器编程学习】10.多线程编程

Linux——多线程编程 •。 阅读详情

linux中的线程

线程是linux中完成一个独立任务的完整执行序列,即一个可调度的实体。根据运行环境,可分为内核线程和用户线程,分别由内核和程序线程库调度。关于linux多线程编程,需要掌握怎么创建和结束线程,怎么读取和设置线程属性,线程同步方式等。

创建和结束线程

  • 线程的创建
#include<pthread.h>
int pthread_create(pthread_t* thread,const pthread_attr_t* attr,void *(start_routline)(void*),void* arg);
thread 是新线程的标识符。
attr用于设置新线程的属性。
start_routline 设置线程将运行的函数
arg是线程运行函数的参数。
成功返回0,失败返回错误码
  • 线程的结束
    pthread_exit 函数通过retval参数向线程的回收者传递其退出信息。
#include<pthread.h>
void pthread_exit(void* retval);

pthread_join 用于回收线程。

#include<pthread.h>
int pthread_join(pthread_t thread,void ** retval);
thread是目标线程的标识符,retval是目标线程返回的退出信息。
成功返回0,失败返回错误码。
该函数会一直阻塞,直到被回收的线程结束。

pthread_cancel立即取消线程。

#include<pthread.h>
int pthread_cancel(pthread_t thread);
thread是线程标识符
成功返回0,失败返回错误码

接收到取消请求的目标线程可以决定是否允许被取消以及如何取消。

#include<pthread.h>
int pthread_setcancelstate(int state,int *oldstate);
int pthread_setcanceltype(int type,int *oldtype);
第一个参数用于设置线程的取消状态(是否允许取消)和取消类型(如何取消)
第二个参数用于记录原来的取消状态和取消类型。

state取值:
PTHREAD_CANCEL_ENABLE  允许线程被取消默认状态
PTHREAD_CANCEL_DISABLE  禁止线程被取消,收到请求取消会挂起,知道允许取消
type取值:
PTHREAD_CANCEL_ASYNCHRONOUS:随时可以被取消
PTHREAD_CANCEL_DEFERRED:允许目标线程推迟行动

POSIX信号量

linux的信号量API有两组,在进程间通信的是System V IPC信号量,用于线程间同步的是POSIX信号量。这两组信号量接口类似,但是不保证能互换。

#include<semphore.h>
int sem_init(sem_t* sem,int pshared,unsigned int value);
初始化一个未命名的信号量,pshared 指定信号量类型,为0表示只能在当前进程中使用,否则在多进程共享,value表示信号量初始值
int semdestroy(sem_t sem);
销毁信号量
int sem_wait(sem_t* sem);
信号量值减1,如变为0则阻塞。
int sem_trywait(sem_t* sem)
非阻塞的sem_wait,如-1后为0,则立即返回-1.
int sem_post(sem_t * sem);
信号量值加1,如阻塞就唤醒

互斥锁

互斥锁可以保护临界区代码段,确保独占式访问。当进入临界区,需要获得互斥锁并加锁,当离开临界区,需要对互斥锁解锁,唤醒其他等待该互斥锁的线程。

#include<pthread.h>
int pthread_mutex_init(pthread_mutex_t* mutex,const pthread_mutexattr_t* mutexattr);
初始化互斥锁,mutexattr通常设为NULL

int pthread_mutex_destroy(pthread_mutex_t* mutex);
销毁互斥锁

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,失败返回错误码

条件变量

如果说互斥锁用于同步线程对共享数据的访问,条件变量机制用于在线程之间同步共享数据的值。
条件变量提供一种线程间通知机制,当某个共享数据到达某个值时,唤醒等待这个共享数据的值。

#include<pthread.h>
int pthread_cond_init(pthread_cond_t* cond,const pthread_condattr_t* cond_attr)
初始化条件变量,cond_attr参数指定条件变量的属性,通常设为NULL
int pthread_cond_destroy(pthread_cond_t* cond);
销毁一个条件变量,销毁一个正在等待的条件变量将返回EBUSY
int pthread_cond_broadcast(pthread_cond_t* cond);
以广播的方式,唤醒所有等待目标条件变量的线程
int pthread_cond_signal(pthread_cond_t* cond);
唤醒一个等待目标条件变量的线程
int pthread_cond_wait(pthread_cond_t* cond,pthread_mutex_t* mutex);
用于等待目标条件变量,mutex参数用于保护条件变量,需要确保存在且上锁。

成功返回0,否则返回错误码。

可重入函数

如果一个函数能被多个线程同时调用且不发生竞态条件,成为线程安全的,或者说是可重入函数。linux库函数只有一小部分是不可重入的。很多不可重入函数被提供了可重入版本,在原函数名尾部加_r。

线程和进程

如果一个多线程程序的某个线程调用了fork函数,新创建的子进程不会自动创建和父进程同样数量的线程。子进程只有一个执行线程,是调用fork那个线程的完整复制,并且子进程会自动继承父进程中互斥锁、条件变量的状态,但是不知道是否上锁,如果这时再加锁就会导致死锁。

pthread提供了一个专门的函数pthread_atfork,确保fork调用后父进程和子进程都有一个清楚的状态。

线程和信号

每个线程都可以独立的设置信号掩码,但是多线程环境下应该使用pthread_sigmask设置信号掩码,与sigprocmask参数和返回值完全相同。

由于进程中的所有线程共享进程的信号和信号处理函数。线程库将根据线程掩码决定把信号发送给哪个具体线程,如果在每个线程中单独设置信号掩码容易出错。

应该定义一个专门的线程处理信号。首先在主线程创建子线程之前就设置好信号掩码,让子线程继承这个信号掩码,然后再某个线程中调用sigwait等待信号并处理。

此外还可以使用pthread_kill 明确的将一个信号发送给指定线程。

后记

机遇固然是好的,但是我们不能只依赖机遇,即便它来了,你也无法保证能抓住它。不如保持长期的计划,做好充足的准备,最后自己创造机遇。

linux tcp多线程服务器与客户端编程实例 服务器端: #include #include #include #include #include #include using namespace std; void *run(void *arg); int main(void) { int fd=0,res=0; unsigned int port=8888; struct sockaddr_in my_addr; // 阅读详情

相关推荐

Linux多线程服务端编程学习(五):多线程HTTP静态服务器

前言 首先,介绍几个类用于封装HTTP请求和响应。 HttpRequest Httpparser HttpResponse HttpRequest类 HttpRequest用于封装HTTP请求,它的成员变量为: enum Method{ Invalid, Get, Post, Head, Put, Delete}; enum Version{ Unknown, Http10, Http11...

freshman94的博客 596

常识----Linux多线程服务器端编程

在Linux操作系统中,当进程调用fork()系统调用创建一个子进程时,该子进程会被复制出一个完整的进程实体,包括了该进程的代码段、数据段、进程堆栈、文件描述符表、信号处理程序等,但是这些数据结构并不是简单地被完全复制的,其实是通过一种“读时共享、写时复制”的技术进行处理的。自旋锁是一种忙等锁,当有线程占用锁的时候,其他线程会不停地尝获取锁,直到锁被释放。在Linux中,自旋锁的实现使用了原子操作指令(如CAS、XCHG等),当线程需要获取锁时,它会不停地尝试修改锁的状态,直到成功修改为锁可用。

writ的博客 990

Linux C 网络编程——多线程的聊天室实现(服务器端)

服务器端的主要功能:        实现多用户群体聊天功能(此程序最多设定为10人,可进行更改),每个人所发送的消息其他用户均可以收到。用户可以随意的加入或退出(推出以字符串“bye”实现),服务器也可以进行关闭。 服务器端的程序结构:        总共有三个函数:主函数(main),实现服务器端的初始化,接受连接;消息处理函数(rcv_snd),接受某一用户的消息,将其进行简单处理之后发

SmarterYu的专栏 1万+

Linux下的多线程编程

1 引言   线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。现在,多线程技术已经被许多操作系统所支持,包括Windows/NT,当然,也包括Linux。   为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题。   使用多线程的理由之一是和进程相比,它

qq_38220914的博客 1104

Linux高并发服务器开发---笔记4(网络编程)

0705Linux高并发服务器开发—笔记1见Linux高并发服务器开发—笔记2见Linux高并发服务器开发—笔记3(多线程)视频课链接: 4.6 网络编程1 4.6 网络编程2计算机网络笔记 ②Linux简明系统编程(嵌入式公众号的课)—总课时12h 网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件,又称为网络适配器或网络接口卡NIC。其拥有 MAC 地址,属于 OSI 模型的第 2 层,它使得用户可以通过或相互连接。(即网卡分为以太网卡和无线网卡)每一个网卡都有一个被称为 MAC 地址的独

weixin_38665351的博客 4075

Linux | 多线程环境编程

文章目录线程与进程一个进程中可以创建多少线程关于strtok函数的线程安全问题在多线程环境中使用forkpthread_atfork 线程与进程 一个进程中可以创建多少线程 为了得出此问题的结果,我们进行一个简单的测试,之后进行分析: #include <stdio.h> #include <assert.h> #include <string.h> #incl...

ZY-JIMMY 2536

Linux多线程编程

linux多线程

lijunlin0329的博客 503

Linux多线程服务端编程,高清无水印!~

Linux多线程服务端编程,高清无水印!~

linux多线程编程书籍推荐:linux大牛之路从这几本书开始总结

linux多线程编程是指基于Linux操作系统下的多线程编程,包括多任务程序的设计,并发程序设计,网络程序设计,数据共享等。Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。小编今天就来把几本linux多线程编程书籍推荐给大家,希望能够帮助到想要了解和学习linux多线程编程

benpaobagzb的博客 1万+

深入剖析一个卷积块(ConvBlock)

深入剖析一个卷积块(ConvBlock)

qq_45670407的博客 1925

论文学习:Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline

title: “Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline” tags: [“论文评述”, “报告”] date: 2019-08-22 author: 叶慧 mathjax: true 论文:Towards Automated Infograph...

xiaoyehahaha的博客 731

《Linux多线程服务端编程:使用muduoC++网络库》学习笔记

boost库安装: apt-cache search boost 搜到所有的boost库 然后: sudo apt-get install libboost-all-dev 安装相应的库 第一章 线程安全的对象生命期管理 1.1 当析构函数遇到多线程 C++多线程对象的销毁可能会碰到竞态条件,解决办法是使用shared_ptr。 1.1.1 线程安全的定义 1.1.2 MutexLock与MutexLockGuard #include<bits/stdc++.h> #include<b

qq_40586164的博客 3454

【RT-Thread】从零到一:RT-Thread Studio工程创建与程序下载全流程实战

本文详细介绍了RT-Thread Studio开发环境的安装与使用,从工程创建到程序下载的全流程实战指南。通过具体案例演示了如何在STM32平台上快速开发RT-Thread应用,包括时钟配置、内存优化、构建调试等关键技巧,帮助开发者高效完成嵌入式系统开发。

weixin_30336061的博客 543

[项目] Linux高并发服务器

[项目] Linux高并发服务器 杂谈 最近越来越感觉那些教你几小时做个网站啊之类的速成教程对技术学习有着很大危害,在贩卖焦虑的同时给你蛇油(虚伪的万金油),造成自己好像学了挺多的,做的挺好的假象。 这对我来说,属实有些折磨了,因为作为普通人类的我,是很难抵挡住大数据推荐的勾引的。 后来想了想还是找一些相对完整的项目学一下比较好,大一下的时候照着大佬的教程写了一个很水的JSON解析库,从中学到了很多,这种满足感真正令我感到充实。比较遗憾的是,后期没有做足够完整的总结,现在很多细节操作都忘的差不多了。 翻了一

鱼竿钓鱼干 7156

【实战指南】利用CAN适配器高效调试CAN总线通信

本文提供了一份利用CAN适配器高效调试CAN总线通信的实战指南。文章从硬件连接、终端电阻配置、软件参数设置等基础环节入手,详细解析了CAN适配器作为关键调试工具的工作原理与使用方法,并针对常见的通信故障提供了系统化的问题排查思路,帮助工程师快速打通通信链路,提升调试效率。

weixin_28285943的博客 412

28、数字电路测试与半导体内存测试全解析

本文全面解析了数字电路中的顺序电路测试生成方法与半导体内存测试技术。内容涵盖顺序电路中的故障检测、多重观察测试、可驱动性分析、伪组合电路测试及初始化问题,并深入探讨了内存技术发展、故障模型、测试流程与未来趋势。重点介绍了DRAM、SRAM等主流内存类型的特点,以及制造和使用过程中面临的永久性与非永久性故障挑战,提出了基于故障模型的高效测试策略与优化方案。

go5gopher的博客 122

Linux高性能服务器编程 | 读书笔记 | 12. 多线程编程

light weight process 轻量级的进程,本质仍是进程(在Linux环境下)进程:独立地址空间,拥有PCB线程:有独立的PCB,但没有独立的地址空间(与进程共享)区别:在于是否共享地址空间。独居(地址空间就是进程一个);合租(地址空间有多个线程)线程:最小的执行(调度)单位进程:最小分配资源单位,可看成是只有一个线程的进程执行该命令可以得到线程号LWP(LWP是cpu执行的最小单位,但和后面讲到的线程id不是一回事)ps aux ps -Lf 进程id //得到该进程里面的线程。

m0_74795952的博客 1862

ETAS工具导入DBC生成Com协议栈

ETAS工具导入DBC主要也是生成arxml用的,ETAS推荐使用Cobra导入,本文介绍导入过程及注意事项不管是导入DBC还是arxml,本质上都是为了生成对应的com协议栈,目的是为了减少重复的工作量,所以,前期定义好收发的矩阵很重要,一般导入一次之后,后面就可以按变更点手动更改了。

赞的博客 1711

Linux高性能服务器编程-多线程

线程就是轻量级进程,线程是最小的执行单位,进程是最小的资源分配单位。

Renyuqiang__的博客 1932

Oracle 从入门到精通系列(入门篇)1.1-Oracle 数据库发展史

Oracle 从入门到精通系列(入门篇)1.1-Oracle 数据库发展史

LuciferLiu_DBA 2190

第3讲:单端传输线的时域TDR仿真(基于实战的第一次仿真视角切换)

本文为CST仿真系列教程的第3讲,主要介绍传输线阻抗(TDR)的两种仿真方法:基于S参数的频域计算和基于高斯脉冲的时域计算。文章详细演示了在CST PCB Studio中修改电容参数、设置TDR仿真参数(包括截止时间和采样点数)的操作步骤,并通过对比实验展示TVS寄生电容对阻抗曲线的影响。最后将两种TDR方法的结果进行对比,验证了两种方法的一致性。本教程适合硬件工程师通过时域波形直观分析传输线阻抗特性,是信号完整性分析的重要技能。

一只豌豆象的博客 228

Linux网络编程(十六)——多线程服务器端的实现

16 多线程服务器端的实现 16.1 理解线程的概念 16.1.1 引入线程的背景 16.1.2 线程和进程的差异 16.2 线程创建及运行 16.2.1 线程的创建和执行流程 16.2.2 可在临界区内调用的函数 16.2.3 工作(Worker)线程模型 16.3 线程存在的问题和临界区 16.3.1 多个线程同时访问同一变量的问题 16.3.2 临界区位置 16.4 线程同步 16.4.1 同步的两面性 16.4.2 互斥量(互斥锁) 16.4.3 信号量 16.5 线程

m0_60875396的博客 934

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux TCP多线程服务器

假设两个核心1,2,4个任务a,b,c,d,ab分配给了核心1,cd分配给了核心2,此时ab就是并发,cd也是并发,a与c就可以并行,b与d也可以并行。假如进程是一个文档编辑器,存放着相应的程序和文档,现在用户用键盘敲下回车,交互的程序接收键盘的按下事件,布局的程序将文字重新排布渲染出来,另外每隔一段时间,写入的程序保存文档到硬盘中,所以这三个程序最好能并行执行,但他们又需要访问修改同一个文档,所以肯定是在同一个进程中,所以现在需要更轻量级的3个线程,交互线程, 渲染线程,保存线程。

R_conqueror的博客 1470

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++高性能服务器框架muduo,与配套书籍《Linux多线程服务端编程》解读

muduo开源代码解析,多线程服务器模型,《Linux多线程服务端编程》阅读笔记,来自作者陈硕。

weixin_40355471的博客 1608

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

多线程服务器

陈硕

floweronwarmbed的专栏 3044
上一篇: 数据结构知识点速记1
下一篇: C++11提供的并发编程
Sweler*19
博客等级 码龄7年 65粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值