当前位置:首页 » 编程软件 » posix编程

posix编程

发布时间: 2023-07-02 17:07:21

linux 多线程编程(二)2019-08-10

三种专门用于线程同步的机制:POSIX信号量,互斥量和条件变量.

在Linux上信号量API有两组,一组是System V IPC信号量,即PV操作,另外就是POSIX信号量,POSIX信号量的名字都是以sem_开头.

phshared参数指定信号量的类型,若其值为0,就表示这个信号量是当前进程的局部信号量,否则该信号量可以在多个进程之间共享.value值指定信号量的初始值,一般与下面的sem_wait函数相对应.

其中比较重要的函数sem_wait函数会以原子操作的方式将信号量的值减一,如果信号量的值为零,则sem_wait将会阻塞,信号量的值可以在sem_init函数中的value初始化;sem_trywait函数是sem_wait的非阻塞版本;sem_post函数将以原子的操作对信号量加一,当信号量的值大于0时,其他正在调用sem_wait等待信号量的线程将被唤醒.
这些函数成功时返回0,失败则返回-1并设置errno.

生产者消费者模型:
生产者对应一个信号量:sem_t procer;
消费者对应一个信号量:sem_t customer;
sem_init(&procer,2)----生产者拥有资源,可以工作;
sem_init(&customer,0)----消费者没有资源,阻塞;

访问公共资源前对互斥量设置(加锁),确保同一时间只有一个线程访问数据,在访问完成后再释放(解锁)互斥量.
互斥锁的运行方式:串行访问共享资源;
信号量的运行方式:并行访问共享资源;
互斥量用pthread_mutex_t数据类型表示,在使用互斥量之前,必须使用pthread_mutex_init函数对它进行初始化,注意,使用完毕后需调用pthread_mutex_destroy.

pthread_mutex_init用于初始化互斥锁,mutexattr用于指定互斥锁的属性,若为NULL,则表示默认属性。除了用这个函数初始化互斥所外,还可以用如下方式初始化:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER。
pthread_mutex_destroy用于销毁互斥锁,以释放占用的内核资源,销毁一个已经加锁的互斥锁将导致不可预期的后果。

pthread_mutex_lock以原子操作给一个互斥锁加锁。如果目标互斥锁已经被加锁,则pthread_mutex_lock则被阻塞,直到该互斥锁占有者把它给解锁.
pthread_mutex_trylock和pthread_mutex_lock类似,不过它始终立即返回,而不论被操作的互斥锁是否加锁,是pthread_mutex_lock的非阻塞版本.当目标互斥锁未被加锁时,pthread_mutex_trylock进行加锁操作;否则将返回EBUSY错误码。注意:这里讨论的pthread_mutex_lock和pthread_mutex_trylock是针对普通锁而言的,对于其他类型的锁,这两个加锁函数会有不同的行为.
pthread_mutex_unlock以原子操作方式给一个互斥锁进行解锁操作。如果此时有其他线程正在等待这个互斥锁,则这些线程中的一个将获得它.


三个打印机轮流打印:

输出结果:

如果说互斥锁是用于同步线程对共享数据的访问的话,那么条件变量就是用于在线程之间同步共享数据的值.条件变量提供了一种线程之间通信的机制:当某个共享数据达到某个值时,唤醒等待这个共享数据的线程.
条件变量会在条件不满足的情况下阻塞线程.且条件变量和互斥量一起使用,允许线程以无竞争的方式等待特定的条件发生.

其中pthread_cond_broadcast函数以广播的形式唤醒所有等待目标条件变量的线程,pthread_cond_signal函数用于唤醒一个等待目标条件变量线程.但有时候我们可能需要唤醒一个固定的线程,可以通过间接的方法实现:定义一个能够唯一标识目标线程的全局变量,在唤醒等待条件变量的线程前先设置该变量为目标线程,然后采用广播的方式唤醒所有等待的线程,这些线程被唤醒之后都检查该变量以判断是否是自己.

采用条件变量+互斥锁实现生产者消费者模型:

运行结果:

阻塞队列+生产者消费者

运行结果:

⑵ 关于编程,c++语言.

关于 C++ 框架、库和资源的一些汇总列表,内容包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。有需要的小伙伴可以收藏一下! C++标准库,包括了STL容器,算法和函数等。 C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。 Standard Template Library:标准模板库 C POSIX library : POSIX系统的C标准库规范 ISO C++ Standards Committee :C++标准委员会
C++通用框架和库 Apache C++ Standard Library:是一系列算法,容器,迭代器和其他基本组件的集合 ASL :Adobe源代码库提供了同行的评审和可移植的C++源代码库磨悉晌。 Boost :大量通用C++库的集合。 BDE :来自于彭博资讯实验室的开发环境。 Cinder:提供专业品质创造性编码的开源开发社区。 Cxxomfort:轻量级的,只包含头文件的库,将C++ 11的一些新特性移植到C++03中。 Dlib:使用契约式编程和现代C++ 科技 设计的通用的跨平台的C++库。 EASTL :EA-STL公共部分 ffead-cpp :企业应用程序开发框架 Folly:由Facebook开发和使用的开源C++库 JUCE :包罗万象的C++类库,用于开发跨平台软件 libPhenom:用于构建高性能和高度可扩展性系统的事件框架。 LibSourcey :用于实时的视频流和高性能网络应用程序的瞎锋C++11 evented IO LibU : C语言写的多平台工具库 Loki :C++库的设计,包括常见的设计模式和习语的实现。 MiLi :只含头文件的小型C++库 openFrameworks :开发C++工具包,用于创意性编码。 Qt :跨平台的应用程序和用户界面框架 Reason :跨平台的框架,使开发者能够更容易地使用Java,.Net和Python,同时也满足了他们对C++性能和优势的需求。 ROOT :具备所有功能的一系列面向对象的框架,能够非常高效地陆隐处理和分析大量的数据,为欧洲原子能研究机构所用。 STLport:是STL具有代表性的版本 STXXL:用于额外的大型数据集的标准模板库。 Ultimate++ :C++跨平台快速应用程序开发框架 Windows Template Library:用于开发Windows应用程序和UI组件的C++库 Yomm11 :C++11的开放multi-methods.
btsk : 游戏 行为树启动器工具 Evolving Objects:基于模板的,ANSI C++演化计算库,能够帮助你非常快速地编写出自己的随机优化算法。 Neu:C++11框架,编程语言集,用于创建人工智能应用程序的多用途软件系统。
Boost.Asio:用于网络和底层I/O编程的跨平台的C++库。 libev :功能齐全,高性能的时间循环,轻微地仿效libevent,但是不再像libevent一样有局限性,也修复了它的一些bug。 libevent :事件通知库 libuv :跨平台异步I/O。
音频,声音,音乐,数字化音乐库 FMOD :易于使用的跨平台的音频引擎和音频内容的 游戏 创作工具。 Maximilian :C++音频和音乐数字信号处理库 OpenAL :开源音频库—跨平台的音频API Opus:一个完全开放的,免版税的,高度通用的音频编解码器 Speex:免费编解码器,为Opus所废弃 Tonic: C++易用和高效的音频合成 Vorbis: Ogg Vorbis是一种完全开放的,非专有的,免版税的通用压缩音频格式。
生物信息,基因组学和生物技术 libsequence:用于表示和分析群体遗传学数据的C++库。 SeqAn:专注于生物数据序列分析的算法和数据结构。 Vcflib :用于解析和处理VCF文件的C++库 Wham:直接把联想测试应用到BAM文件的基因结构变异。
压缩和归档库 bzip2:一个完全免费,免费专利和高质量的数据压缩 doboz:能够快速解压缩的压缩库 PhysicsFS:对各种归档提供抽象访问的库,主要用于视频 游戏 ,设计灵感部分来自于Quake3的文件子系统。 KArchive:用于创建,读写和操作文件档案(例如zip和 tar)的库,它通过QIODevice的一系列子类,使用gzip格式,提供了透明的压缩和解压缩的数据。 LZ4 :非常快速的压缩算法 LZHAM :无损压缩数据库,压缩比率跟LZMA接近,但是解压缩速度却要快得多。 LZMA :7z格式默认和通用的压缩方法。 LZMAT :及其快速的实时无损数据压缩库 miniz:单一的C源文件,紧缩/膨胀压缩库,使用zlib兼容API,ZIP归档读写,PNG写方式。 Minizip:Zlib最新bug修复,支持PKWARE磁盘跨越,AES加密和IO缓冲。 Snappy :快速压缩和解压缩 ZLib :非常紧凑的数据流压缩库 ZZIPlib:提供ZIP归档的读权限。
并发执行和多线程 Boost.Compute :用于OpenCL的C++GPU计算库 Bolt :针对GPU进行优化的C++模板库 C++React :用于C++11的反应性编程库 Intel TBB :Intel线程构件块 Libclsph:基于OpenCL的GPU加速SPH流体仿真库 OpenCL :并行编程的异构系统的开放标准 OpenMP:OpenMP API Thrust :类似于C++标准模板库的并行算法库 HPX :用于任何规模的并行和分布式应用程序的通用C++运行时系统 VexCL :用于OpenCL/CUDA 的C++向量表达式模板库。
C++ B-tree :基于B树数据结构,实现命令内存容器的模板库 Hashmaps: C++中开放寻址哈希表算法的实现
Bcrypt :一个跨平台的文件加密工具,加密文件可以移植到所有可支持的操作系统和处理器中。 BeeCrypt: Botan: C++加密库 Crypto++:一个有关加密方案的免费的C++库 GnuPG: OpenPGP标准的完整实现 GnuTLS :实现了SSL,TLS和DTLS协议的安全通信库 Libgcrypt libmcrypt LibreSSL:免费的SSL/TLS协议,属于2014 OpenSSL的一个分支 LibTomCrypt:一个非常全面的,模块化的,可移植的加密工具 libsodium:基于NaCI的加密库,固执己见,容易使用 Nettle 底层的加密库 OpenSSL : 一个强大的,商用的,功能齐全的,开放源代码的加密库。 Tiny AES128 in C :用C实现的一个小巧,可移植的实现了AES128ESB的加密算法
数据库,SQL服务器,ODBC驱动程序和工具 hiberlite :用于Sqlite3的C++对象关系映射 Hiredis: 用于Redis数据库的很简单的C客户端库 LevelDB: 快速键值存储库 LMDB:符合数据库四大基本元素的嵌入键值存储 MySQL++:封装了MySql的C API的C++ 包装器 RocksDB:来自Facebook的嵌入键值的快速存储 SQLite:一个完全嵌入式的,功能齐全的关系数据库,只有几百KB,可以正确包含到你的项目中。
调试库, 内存和资源泄露检测,单元测试 Boost.Test:Boost测试库 Catch:一个很 时尚 的,C++原生的框架,只包含头文件,用于单元测试,测试驱动开发和行为驱动开发。 CppUnit:由JUnit移植过来的C++测试框架 CTest:CMake测试驱动程序 googletest:谷歌C++测试框架 ig-debugheap:用于跟踪内存错误的多平台调试堆 libtap:用C语言编写测试 MemTrack —用于C++跟踪内存分配 microprofile- 跨平台的网络试图分析器 minUnit :使用C写的迷你单元测试框架,只使用了两个宏 Remotery:用于web视图的单一C文件分析器 UnitTest++:轻量级的C++单元测试框架
Cocos2d-x :一个跨平台框架,用于构建2D 游戏 ,互动图书,演示和其他图形应用程序。 Grit :社区项目,用于构建一个免费的 游戏 引擎,实现开放的世界3D 游戏 。 Irrlicht :C++语言编写的开源高性能的实时#D引擎 Polycode:C++实现的用于创建 游戏 的开源框架(与Lua绑定)。
CEGUI : 很灵活的跨平台GUI库 FLTK :快速,轻量级的跨平台的C++GUI工具包。 GTK+: 用于创建图形用户界面的跨平台工具包 gtkmm :用于受欢迎的GUI库GTK+的官方C++接口。 imgui:拥有最小依赖关系的立即模式图形用户界面 libRocket :libRocket 是一个C++ HTML/CSS 游戏 接口中间件 MyGUI :快速,灵活,简单的GUI Ncurses:终端用户界面 QCustomPlot :没有更多依赖关系的Qt绘图控件 Qwt :用户与技术应用的Qt 控件 QwtPlot3D :功能丰富的基于Qt/OpenGL的C++编程库,本质上提供了一群3D控件 OtterUI :OtterUI 是用于嵌入式系统和互动 娱乐 软件的用户界面开发解决方案 PDCurses 包含源代码和预编译库的公共图形函数库 wxWidgets C++库,允许开发人员使用一个代码库可以为widows, Mac OS X,Linux和其他平台创建应用程序
bgfx:跨平台的渲染库 Cairo:支持多种输出设备的2D图形库 Horde3D 一个小型的3D渲染和动画引擎 magnum C++11和OpenGL 2D/3D 图形引擎 Ogre 3D 用C++编写的一个面向场景,实时,灵活的3D渲染引擎(并非 游戏 引擎) OpenSceneGraph 具有高性能的开源3D图形工具包 Panda3D 用于3D渲染和 游戏 开发的框架,用Python和C++编写。 Skia 用于绘制文字,图形和图像的完整的2D图形库 urho3d 跨平台的渲染和 游戏 引擎。
Boost.GIL:通用图像库 CImg :用于图像处理的小型开源C++工具包 CxImage :用于加载,保存,显示和转换的图像处理和转换库,可以处理的图片格式包括 BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K。 FreeImage :开源库,支持现在多媒体应用所需的通用图片格式和其他格式。 GDCM:Grassroots DICOM 库 ITK:跨平台的开源图像分析系统 Magick++:ImageMagick程序的C++接口 MagickWnd:ImageMagick程序的C++接口 OpenCV : 开源计算机视觉类库 tesseract-ocr:OCR引擎 VIGRA :用于图像分析通用C++计算机视觉库 VTK :用于3D计算机图形学,图像处理和可视化的开源免费软件系统。 最后, 对于学习编程或者在工作想升职的程序员兄弟,如果你想更好的提升你的编程能力帮助你提升水平! 笔者这里或许可以帮到你~ 编程学习书籍分享: 编程学习视频分享: 分享(源码、项目实战视频、项目笔记,基础入门教程) 欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

⑶ Linux POSIX编程如何查询指定的线程是否阻塞

使用线程间通信,在才确定的代码位置使用mutex就可以完成你所要的功能。

线程互斥

互斥意味着“排它”,即两个线程不能同时进入被互斥保护的代码。Linux下可以通过pthread_mutex_t 定义互斥体机制完成多线程的互斥操作,该机制的作用是对某个需要互斥的部分,在进入时先得到互斥体,如果没有得到互斥体,表明互斥部分被其它线程拥有,此时欲获取互斥体的线程阻塞,直到拥有该互斥体的线程完成互斥部分的操作为止。

下面的代码实现了对共享全局变量x 用互斥体mutex 进行保护的目的:

int x; // 进程中的全局变量
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL); //按缺省的属性初始化互斥体变量mutex
pthread_mutex_lock(&mutex); // 给互斥体变量加锁
… //对变量x 的操作
phtread_mutex_unlock(&mutex); // 给互斥体变量解除锁

线程同步

同步就是线程等待某个事件的发生。只有当等待的事件发生线程才继续执行,否则线程挂起并放弃处理器。当多个线程协作时,相互作用的任务必须在一定的条件下同步。

Linux下的C语言编程有多种线程同步机制,最典型的是条件变量(condition variable)。pthread_cond_init用来创建一个条件变量,其函数原型为:

pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *attr);

pthread_cond_wait和pthread_cond_timedwait用来等待条件变量被设置,值得注意的是这两个等待调用需要一个已经上锁的互斥体mutex,这是为了防止在真正进入等待状态之前别的线程有可能设置该条件变量而产生竞争。pthread_cond_wait的函数原型为:

pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex);

pthread_cond_broadcast用于设置条件变量,即使得事件发生,这样等待该事件的线程将不再阻塞:

pthread_cond_broadcast (pthread_cond_t *cond) ;

pthread_cond_signal则用于解除某一个等待线程的阻塞状态:

pthread_cond_signal (pthread_cond_t *cond) ;

pthread_cond_destroy 则用于释放一个条件变量的资源。

在头文件semaphore.h 中定义的信号量则完成了互斥体和条件变量的封装,按照多线程程序设计中访问控制机制,控制对资源的同步访问,提供程序设计人员更方便的调用接口。

sem_init(sem_t *sem, int pshared, unsigned int val);

这个函数初始化一个信号量sem 的值为val,参数pshared 是共享属性控制,表明是否在进程间共享。

sem_wait(sem_t *sem);

调用该函数时,若sem为无状态,调用线程阻塞,等待信号量sem值增加(post )成为有信号状态;若sem为有状态,调用线程顺序执行,但信号量的值减一。

sem_post(sem_t *sem);

调用该函数,信号量sem的值增加,可以从无信号状态变为有信号状态。

⑷ 安卓和ios编程需要什么语言

1、安卓编程需要linux语言

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。

它除了在服务器操作系统方面保持着强劲的发展势头以外,在个人电脑、嵌入式系统上都有着长足的进步。使用者不仅可以直观地获取该操作系统的实现机制,而且可以根据自身的需要来修改完善这个操作系统,使其最大化地适应用户的需要。

Linux不仅系统性能稳定,而且是开源软件。其核心防火墙组件性能高效、配置简单,保证了系统的安全。

在很多企业网络中,为了追求速度和安全,Linux操作系统不仅仅是被网络运维人员当作服务器使用,Linux既可以当作服务器,又可以当作网络防火墙是Linux的 一大亮点。

Linux与其他操作系统相比 ,具有开放源码、没有版权、技术社区用户多等特点 ,开放源码使得用户可以自由裁剪,灵活性高,功能强大,成本低。尤其系统中内嵌网络协议栈 ,经过适当的配置就可实现路由器的功能。这些特点使得Linux成为开发路由交换设备的理想开发平台。

2、ios编程需要MacOS语言

Mac OS是一套运行于苹果Macintosh系列电脑上的操作系统。

Mac OS是首个在商用领域成功的图形用户界面操作系统。现行的最新的系统版本是macOS 10.15 beta 4 ,且网上也有在PC上运行的Mac系统(Hackintosh)。

Mac系统是基于Unix内核的图形化操作系统;一般情况下在普通PC上无法安装的操作系统。

由苹果自行开发。苹果机的操作系统已经到了OS 10,代号为Mac OS X(X为10的罗马数字写法),这是MAC电脑诞生15年来最大的变化。新系统非常可靠;它的许多特点和服务都体现了苹果的理念。

另外,疯狂肆虐的电脑病毒几乎都是针对Windows的,由于MAC的架构与Windows不同,所以很少受到病毒的袭击。macOS操作系统界面非常独特,突出了形象的图标和人机对话。苹果不仅自己开发系统,也涉及到硬件的开发。

2011年7月20日Mac OS X已经正式被苹果改名为OSX。2016年,OS X改名为macOS,与iOS,tvOS,watchOS相照应。

最新版本为macOS 10.14.6(Mojave),2019年5月14日凌晨发布。

2018年3月30日,苹果推送了macOS High Sierra 10.13.4正式版,新版本增强了对外接eGPU的支持,还新增了此前iMac Pro专属的墨水云墙纸。

2018年9月25日,苹果推送macOS Mojave 10.14,增加了深色模式,更新了Safari浏览器,Mac App Store,访达,桌面,股市,语音备忘录,家庭App等。

北京时间2019年6月4日凌晨1点,2019年WWDC全球开发者大会上苹果发布macOS Catalina 10.15,用户能将iPad用作Mac电脑的第二块显示屏,可以实现语音控制。

(4)posix编程扩展阅读:

linux语言主要特性:

基本思想

Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。

其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。至于说Linux是基于Unix的,很大程度上也是因为这两者的基本思想十分相近。

完全免费

Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。

正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变,这让Linux吸收了无数程序员的精华,不断壮大。

完全兼容POSIX1.0标准

这使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows的程序。这为用户从Windows转到Linux奠定了基础。许多用户在考虑使用Linux时,就想到以前在Windows下常见的程序是否能正常运行,这一点就消除了他们的疑虑。

多用户、多任务

Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行。

良好的界面

Linux同时具有字符界面和图形界面。在字符界面用户可以通过键盘输入相应的指令来进行操作。它同时也提供了类似Windows图形界面的X-Window系统,用户可以使用鼠标对其进行操作。

在X-Window环境中就和在Windows中相似,可以说是一个Linux版的Windows。

支持多种平台

Linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台。此外Linux还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。

2001年1月份发布的Linux 2.4版内核已经能够完全支持Intel64位芯片架构。同时Linux也支持多处理器技术。多个处理器同时工作,使系统性能大大提高。

热点内容
解压带教程 发布:2025-02-08 01:16:33 浏览:758
什么是程序存储器 发布:2025-02-08 01:05:01 浏览:313
解压包手机安装 发布:2025-02-08 00:49:29 浏览:960
詹雯婷访问 发布:2025-02-08 00:42:02 浏览:309
php无限分类树 发布:2025-02-08 00:42:01 浏览:814
clang编译命令 发布:2025-02-08 00:41:24 浏览:127
数据结构c语言版算法 发布:2025-02-08 00:28:19 浏览:663
python环境管理 发布:2025-02-08 00:26:51 浏览:999
个人简历源码 发布:2025-02-08 00:26:43 浏览:14
html5canvas上传图片 发布:2025-02-08 00:20:44 浏览:169