使用pthread库进行多线程编程2 - UNIX高级环境编程第12章读书笔记

linux pthread 基本使用 阅读详情

12 Thread Control

1 Thread Limits

用sysconf函数可以获得和thread相关的一些系统信息,主要是线程相关的一些最大值:

NAME

Description

Argument

PTHREAD_DESTRUCTOR_ITERATIONS

最大尝试销毁线程相关数据(Thread Specific Data)的次数,见下面关于Thread-Specific Data的内容

_SC_THREAD_DESTRUCTOR_ITERATIONS

PTHREAD_KEYS_MAX

一个进程所能够创建的最大键数

_SC_THREAD_KEYS_MAX

PTHREAD_STACK_MIN

线程栈的最小值

_SC_THREAD_STACK_MIN

PTHREAD_THREADS_MAX

单个进程中的线程个数最大值

_SC_THREAD_THREADS_MAX

 

部分概念在后面会提到。

虽然标准定义了这些常量,不过在很多系统上面可能根本就没有定义对应的Argument(如_SC_THREAD_DESTRUCTOR_ITERATIONS可能未定义),或者sysconf函数返回错误。因此在很多时候这些很难派上用场。

2 Thread Attributes

在前面讲到pthread_create等函数的时候,这些函数有一个参数pthread_attr_t。缺省情况下可以传NULL。但是如果想自己定义线程的相关属性的话,应该调用pthread_attr_init函数来定义:

#include <pthread.h>

 

int pthread_attr_init(pthread_attr_t *attr);

 

int pthread_attr_destroy(pthread_attr_t *attr);

 

返回0表示正常,出错时返回错误值

pthread_attr_init函数负责初始化pthread_attr_t结构为缺省值。pthread_attr_destroy负责释放在pthread_attr_init函数调用时分配的内存,同时将pthread_attr的内容置为非法。如果要修改属性,需要调用其他函数来手动设置。

基本的线程属性如下:

Name

Description

detachstate

detached状态,在前一章中有讲述

guardsize

线程栈底部的Guard缓冲区的大小

stackadddr

线程栈的最低地址

stacksize

线程栈的大小

1.     Detached State:一个线程如果出于Detached状态,说明此线程在退出的时候可以立刻释放其资源和对应的结束代码,从而无法使用pthread_join。可以用pthread_attr_setdetachedstate函数来设置Detach状态。传入PTHREAD_CREATE_DETACHED可以让线程启动的时候就处于Detached状态,而传入PTHREAD_CREATE_JOINABLE则是以通常状态启动线程

#include <pthread.h>

 

int pthread_attr_getdetachedstate(const pthread_attr_t *restrict attr, int *detachstate);

 

int pthread_attr_setdetachedstate(pthread_attr_t *restrict attr, int detachstate);

 

返回0表示正常,出错时返回错误值

 

2.     GuardSize:在线程栈的末尾有一个比较小的内存区域,这个内存区域是保护起来的,一旦栈发生overflow,系统立刻就会知道,发送一个Signal(Windows也有类似的功能,只不过是用于自动增长栈的大小)。缺省情况下这个大小正好是一个页=PAGESIZE。甚至可以用函数将该数值设置为0来禁止这个功能。如果我们修改了栈地址的话,系统会认为我们会自己处理Overflow的问题,因此也不会提供这个功能。调用pthread_attr_get_guardsize & pthread_attr_set_guardsize可以获得/设置这个值:

#include <pthread.h>

 

int pthread_attr_getguardsize(const pthread_attr_t *restrict attr, size_t *restrict guardsize);

 

int pthread_attr_setguardsize(pthread_attr_t *restrict attr, size_t guardsize);

 

返回0表示正常,出错时返回错误值

 

3.     StackSize:线程可以自己设置栈的大小,用pthread_attr_getstacksize和pthread_attr_setstacksize:

#include <pthread.h>

 

int pthread_attr_getguardsize(const pthread_attr_t *restrict attr, size_t *restrict stacksize);

 

int pthread_attr_setguardsize(pthread_attr_t *restrict attr, size_t stacksize);

 

返回0表示正常,出错时返回错误值

 

4.     StackAddr:当进程中线程过多的时候,有可能会栈空间不足。一个方案是用malloc或者nmap来分配新的内存,作为一个另外的栈,供线程使用。可以调用pthread_attr_setstack和pthread_attr_getstack来获得/设置:

#include <pthread.h>

 

int pthread_attr_getstack(const pthread_attr_t *restrict attr, void **restrict stackaddr, size_t *restrict stacksize);

 

int pthread_attr_setstack(pthread_attr_t *restrict attr, void *stackaddr, size_t *stacksize)

 

返回0表示正常,出错时返回错误值

 

除此之外,还有其他一些线程属性:

1.     Cancellability State

2.     Cancellability Type

3.     Concurrency Level

1和2会在第6节中讲述。

Concurrency Level定义了用户模式线程和内核线程/进程之间的对应关系。如果具体操作系统实现是按照1对1,也就是一个用户模式线程对应一个内核模式线程的话,那么修改这个值没有作用。但是如果操作系统实现用少量内核模式线程/进程来模拟用户模式线程的话,那么修改这个值可能会提高或者降低程序和系统的性能。Level值并没有具体的意义,只是一个hint。Level=0表示让系统自动选择。函数原型如下:

#include <pthread.h>

 

int pthread_attr_getconcurrency(void);

 

int pthread_attr_setconcurrency(int level);

 

返回0表示正常,出错时返回错误值

注意这个属性不是和具体线程相关的,而是系统级别的。

3 Synchronization Attributes

同步对象也有他们自己的Attributes。

3.1 Mutex Attributes

Mutex的属性类型为pthread_mutexattr_t。可以用pthread_mutexattr_init和pthread_mutexattr_destroy来创建和释放Mutex Attributes。类似的,pthread_mutexattr_init函数会将结构初始化为缺省值。

#include <pthread.h>

 

int pthread_mutexattr_init(pthread_mutexattr_t *attr);

 

int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);

 

返回0表示正常,出错时返回错误值

 

Mutex的属性有:

1.     Process-Shared:指定Mutex是否为多个进程所共享。缺省值是PTHREAD_PROCESS_PRIVATE,即只有创建者进程才可以访问此Mutex。也可以设置为PTHREAD_PROCESS_SHARED,在多个进程之间共享。

#include <pthread.h>

 

int pthread_mutexattr_getpshared(const pthread_mutexattr_t *restrict attr, int *restrict pshared);

 

int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);

 

返回0表示正常,出错时返回错误值

 

2.     Type:指定Mutex的类型。Mutex有下列类型:

Type

未释放锁的情况获得锁

未获得锁情况下释放锁

已释放锁的情况下再次释放

Description

PTHREAD_MUTEX_NORMAL

死锁

未定义

未定义

一般的Mutex

PTHREAD_MUTEX_ERRORCHECK

出错

出错

出错

加强错误检查

PTHREAD_MUTEX_RECURSIVE

允许

出错

出错

允许单个线程获得锁多次,需要多次释放,但是不能超过获得锁的次数。一般用来处理可重入的函数,见下面一章

PTHREAD_MUTEX_DEFAULT

未定义

未定义

未定义

完全没有错误检查

通过调用pthread_mutexattr_gettype & pthread_mutexattr_settype来获得/设置对应的type:

#include <pthread.h>

 

int pthread_mutexattr_gettype(const pthread_mutexattr_t *restrict attr, int *restrict type);

 

int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);

 

返回0表示正常,出错时返回错误值

 

3.2 Reader-Writer Lock Attributes

类似Mutex Attributes,但是只支持Process Shared属性。

3.3 Condition Variable Attributes

类似Mutex Attributes,但是只支持Process Shared属性。

4 Reentrancy

1.     大部分Single UNIX Specification所定义的函数都是线程安全的,但是也有不少例外。实际使用的时候建议参考文档,确定函数是否是线程安全。

2.     文件支持用ftrylockfile, flockfile, funlockfile来锁定文件访问。标准IO函数被要求必须调用在内部实现中调用flockfile, funlockfile。基于字符的部分IO函数具有非线程安全版本,以_unlocked结尾,如:getchar_unlocked, getc_unlocked, putchar_unlocked, putc_unlocked

3.     书中提供了一个可重入的getenv_r实现。要点是:

a.     用到了Recursive Mutex(使用pthread_mutexattr_settype函数调用设置)来保护自己和其他线程冲突(普通的Mutex就可以做到),同时允许重入(必须用Recursive Mutex)

b.     要求调用者提供自己的buffer,而不是用静态全局变量envbuf来访问结果

c.     使用pthread_once函数保证只调用一个初始化函数一遍,用于初始化Mutex(当然用其他方法也可以)

5 Thread-Specific Data

1.     Thread-Specific Data是一种很方便的将数据和线程联系起来的方法,在C Runtime中也大量用到Thread-Specific Data来维护线程相关的数据,一个典型的例子是errno:实际上errno是一个函数调用,返回和线程相关的错误值。Windows中有类似的机制,称为TLS (Thread Local Storage)

2.     访问Thread-Specific Data需要使用Key。不同线程使用同一个key访问同一类型的数据(比如Errno),但是可以存放不同的值。Key的类型为pthread_key_t

3.     用pthread_key_create函数创建key:

#include <pthread.h>

 

int pthread_key_create(pthread_key_t *keyp, void (*destructor)(void *))

 

返回0表示正常,出错时返回错误值

创建好之后key对应的Thread-Specific Data为NULL。

Destructor函数指针指定当pthread_key_t被删除的时候需要自动调用的函数,可以传NULL。参数值为TSD的具体值,必然非NULL。在线程正常退出时候,如return或者pthread_exit,当数据值为非NULL时候会调用。但是当线程非正常退出,如调用exit, _exit,  _Exit, abort或者其他非正常退出的时候,destructor不会被调用。一般情况下,这个destructor用来销毁用户用malloc为Thread-Specific Data分配的空间。注意:一般不应该用destructor来调用pthread_key_delete,因为delete对于一个key只用调一次,而destructor是对每个线程都调用的,前提是线程正常退出并且TSD不为NULL。

Key的总数量可能会有限制。可以用PTHREAD_KEYS_MAX来查询最大值。

因为调用Destructor的时候这个Destructor可能又会创建新的Key,所以当线程退出的时候,调用Destructor的过程会反复继续直到没有key具有非NULL值或者次数到达最大值PTHREAD_DESTRUCTOR_ITERATIONS为止。这个值可以用sysconf获得。

4.     用pthread_key_delete函数删除key:

#include <pthread.h>

 

int pthread_key_delete(pthread_key_t *keyp)

 

返回0表示正常,出错时返回错误值

 

注意,调用此函数不会导致Destructor被调用!

5.     可以用pthread_once函数保证某个函数只被调一次,用法如下:

#include <pthread.h>

 

pthread_once_t initflag = PTHREAD_ONCE_INIT;

 

int pthread_once(pthread_once_t *initflag, void (*initfn)(void));

 

返回0表示正常,出错时返回错误值

即使在多个线程中被调,pthread_once保证initfn在进程中只会调用一次。

6.     pthread_getspecific和pthread_setspecific用于访问key所对应的Thread-Specific Data,就是一个void *指针:

#include <pthread.h>

 

Void * pthread_getspecific(pthread_key_t key)

 

返回和key相关的当前线程的Thread-Specific Data

 

int pthread_setspecific(pthread_key_t key, const void *value)

 

返回0表示正常,出错时返回错误值

 

6 Cancel Options

除了上面介绍的Thread Attributes之外,还有两个Thread Attributes没有介绍,这两个均和pthread_cancel函数有关。

1.     Cancelability State:表示允许或者禁止pthread_cancel调用。PTHREAD_CANCEL_ENABLE和PTHREAD_CANCEL_DISABLE分别对应允许和禁止(缺省情况下自然是允许)。调用pthread_setcancelstate来设置状态:

#include <pthread.h>

 

int pthread_setcancelstate(int state, int *oldstate)

 

返回0表示正常,出错时返回错误值

注意:这个函数对当前线程有效,并非设置pthread_attr_t

如果对一个线程调用pthread_cancel,线程会继续运行知道线程到达一个Cancellation Point,也就是可撤销点。POSIX.1定义了一些可以作为Cancellation Point的一些函数。

 

你也可以自己定义自己的Cancellation Point,通过调用pthread_testcancel:

#include <pthread.h>

 

int pthread_testcancel(void)

 

返回0表示正常,出错时返回错误值

 

2.     Cancelability Type:指定Cancel的类型。缺省情况下,行为正如我们之前所描述的那样,线程会运行到一个Cancellation Point再Cancel,称之为Deferred Cancellation,对应的常量为PTHREAD_CANCEL_DEFERRED。此外,还支持一种称为PTHREAD_CANCEL_ASYNCHRONOUS的类型。这种情况下,线程会立刻被Cancel,无需得到Cancellation Point。使用pthread_setcanceltype可以改变线程的CancelType属性属性

#include <pthread.h>

 

int pthread_setcanceltype(int type, int *oldtype)

 

返回0表示正常,出错时返回错误值

注意:这个函数对当前线程有效,并非设置pthread_attr_t

 

7 Threads and Signals

pthread_sigmask函数可以阻止Signal的发送:

#include <pthread.h>

 

int pthread_sigmask(int how, const sigset_t *restrict set, sigset_t *restrict oset)

 

返回0表示正常,出错时返回错误值

 

调用sigwait函数可以等待signal的产生:

#include <pthread.h>

 

int sigwait(const sigset_t *restrict set, int *restrict signop);

 

返回0表示正常,出错时返回错误值

当signal是pending的情况下,调用sigwait会立刻返回并且把signal从pending list中移走,这样这个signal就不会被调用。为了避免这种行为,可以将pthread_sigmask和sigwait合用,首先用pthread_sigmask在signal产生之前阻止某个signal,然后用sigwait等待这个signal。Sigwait会自动Unblock这个signal,然后在等待结束之后恢复mask。

调用pthread_kill可以给一个线程发送signal:

#include <pthread.h>

 

int pthread_kill(pthread_t thread, int signo)

 

返回0表示正常,出错时返回错误值

 

8 Threads and fork

当线程调用fork的时候,整个进程的地址空间都被copy(严格来说是copy-on-write)到child。所有Mutex  / Reader-Writer Lock / Condition Variable的状态都被继承下来。子进程中,只存在一个线程,就是当初调用fork的进程的拷贝。由于不是所有线程都被copy,因此需要将所有的同步对象的状态进行处理。(如果是调用exec函数的话没有这个问题,因为整个地址空间被丢弃了)处理的函数是pthread_atfork:

#include <pthread.h>

 

int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));

 

返回0表示正常,出错时返回错误值

 

1.     Prepare:在fork创建child进程之前,在parent进程中调用。职责是:获得所有的锁

2.     Parent:在fork创建child进程之后,但在fork调用返回之前,在parent进程中调用。职责是:释放在prepare中获得的所有的锁

3.     Child:在fork创建child进程之后,在fork调用返回值钱,在child进程中调用。职责是:释放在prepare中获得的所有的锁。看起来child和Parent这两个handler做的是重复的工作,不过实际情况不是这样。由于fork会make一份进程地址空间的copy,所以parent和child是在释放各自的锁的copy

 

9 Threads and I/O

因为文件指针的位置是和进程相关的,所以当不同线程调用lseek、read、write的时候容易造成问题。pread & pwrite函数可以用来解决这个问题。这两个函数会设置文件指针然后读写,作为一个原子操作。

 

 
Unix环境高级编程学习笔记(七) 多线程 线程概述 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。现在,多线程技术已经被许多操作系统所支持,包括Windows/NT,当然,也包括Linux。   为什么有了进程的概念后,还要再引入线程呢?使用多线 阅读详情

相关推荐

Windows环境下pthread多线程库的使用与实践

简介:在多线程编程中,pthread是UNIX类系统广泛采用的标准API,为跨平台开发提供了统一的线程管理接口。尽管Windows原生支持自身的线程API,但通过引入如libpthread-win32等开源实现,开发者可在Windows下使用pthread进行多线程程序设计,提升代码可移植性。本文介绍Windows平台下pthread库的核心功能与使用方法,涵盖线程创建、同步机制、属性设置及调度控制等内容,帮助开发者掌握跨平台多线程编程的关键技术,并了解其在性能和兼容性方面的注意事项。

weixin_42465140的博客 1021

在C语言中使用POSIX线程库(pthread)实现多线程编程

在C语言中,我们可以使用POSIX线程库(pthread)来创建和管理线程。本文将详细介绍该库中主要包含的线程管理函数和线程同步函数,并给出了示例解析

zy4213的博客 2145

pthread库在CMake项目中的集成与问题解决

本文还有配套的精品资源,点击获取 简介:多线程编程是提高程序性能的关键技术,其中pthread库作为Unix-like系统的标准多线程API,提供了线程管理、同步和通信的接口。本文详细探讨了如何在CMake项目中处理无法找到pthread.h头文件的问题,包括确认操作系统对pthreads的支持、安装必要的开发文件,以及在CMake中配置pthread库。此外,介绍了与pthread相关的扩展技术和工具,如Windows平台下的线程操作模拟,以及pthread库文档和预编译版本,

weixin_31315007的博客 1314

多线程下的信号

5. 线程和信号 5.1 多线程中的信号 (1)在Linux的多线程中使用信号机制,与在进程中使用信号机制有着根本的区别。在进程环境中,对信号的处理是,先注册信号处理函数,当信号异步发生时,调用处理函数来处理信号。它完全是异步的。因此,信号处理函数里有时要考虑某些函数可重入或被异步信号中断后的处理。 (2)然而,多线程中处理信号的原则却完全不同,它的基本原则是:将对信号的异步处理,转换成同步处理,也就是说用一个线程专门的来“同步等待”信号的到来,而其它的线程可以完全不被该信号中断/打断(interru

thinker 1512

Sparse4Dv3

instance_feature也设置为nn.Parameter。修正分支2*(linear->relu->linear->relu->layernorm)->linear->scale,分类分枝2*(linear->relu->layernorm)->linear(256,9),质量评估分枝2*(linear->relu->layernorm)->linear(256,2)。每组两类instance,1是加上范围(-x,x)内均匀分布噪声,2是加上(-2x,-x)U(x,2x)范围内均匀分布噪声。

yuanl15的博客 1351

LLM之RAG实战(五十四)| 复杂文档处理RAG框架:Ragflow

RAGFlow 是一种结合了检索增强(Retrieval-Augmented Generation,RAG)与流程控制(Flow)的人工智能技术架构。它通过检索外部知识库中的信息,结合自然语言生成技术,为用户提供更准确、更丰富的回答。同时,它还引入了流程控制机制,能够根据任务需求动态调整信息检索和生成的流程,从而更好地完成复杂的任务。RAGFlow 的核心优势在于将检索和生成相结合,打破了传统生成模型仅依赖内部参数进行文本生成的局限。

wshzd的博客 1067

多线程互斥锁问题(多线程模拟银行存取款)

通过以下代码可以看到互斥锁的重要性: #include #include #include static int totalmoney = 20000;   //总金额20000 pthread_mutex_t mutex ; //定义变量 int Check_balance() { return totalmoney; } void Sa

Hero06206的专栏 2925

告别TwinCAT:手把手教你用IgH EtherCAT Master在LinuxCNC上搭建实时运动控制平台

本文详细介绍了如何利用IgH EtherCAT Master和LinuxCNC搭建开源实时运动控制平台,替代商业软件TwinCAT。通过分步指南,包括实时Linux环境配置、EtherCAT主站安装、LinuxCNC集成及多轴同步控制实现,帮助开发者构建高性能、低成本的工业自动化解决方案。

weixin_42641741的博客 401

多线程并发服务器实现--pthread

目录 1. 多线程服务器分析 2. 多线程实现代码: 3. 优化多线程实现代码: 1. 多线程服务器分析 在使用线程模型开发服务器时需考虑以下问题: 调整进程内最大文件描述符上限 线程如有共享数据,考虑线程同步 服务于客户端线程退出时,退出处理。(退出值,分离态) 系统负载,随着链接客户端增加,导致其它线程不能及时得到CPU 1. Socket(); 创建 监听套接字 lfd 2. Bind() 绑定地址结构 Strcut scokaddr_in addr; 3. Listen();

kakaka666的博客 407

PLC编程标准之争:IEC61131与IEC61499核心区别与选型指南

在工业自动化领域,PLC编程长期依赖IEC61131标准,它定义了梯形图、结构化文本等语言,通过周期扫描机制保证确定性执行。然而,随着工业4.0和分布式控制场景的兴起,IEC61499以事件驱动模型打破传统范式,让功能块能跨设备协同,实现更灵活的柔性产线和模块化系统。理解两者在程序结构、数据交互、部署方式和实时性上的差异,是选型与工程落地的关键。本文从基础概念出发,剖析执行模型与架构演进,结合一线调试经验,帮助工程师在传统PLC与下一代标准之间做出理性决策。

weixin_27014595的博客 268

分享一个简单的迭代学习机器人双臂控制(MATLAB)

1 什么是迭代学习控制 迭代学习控制(iterative learning control,简称ILC)由Uchiyama于1978年首先提出,不过因为论文由日文撰写,影响不是很大。1984年,Arimoto等人用英文介绍了该方法。它是指不断重复一个同样轨迹的控制尝试,并以此修正控制律,以得到非常好的控制效果的控制方法。 迭代学习控制的特点是“在重复中学习”,通过反复的迭代修正,达到改善控制效果的目的。迭代学习控制的原理是根据系统前次运行所获得的输出误差信息,在控制过程中不断修正控制输入,随着迭代的进行,逐

weixin_45776027的博客 4483

【线程编程】线程编程之Pthreads

C语言提供了多种多线程并发的框架和库,其中最常用的是 POSIX线程库(Pthreads)。Pthreads库提供了一套标准的API,使得开发者可以轻松地编写多线程并发的程序。这是一套由POSIX提出的通用的线程库,在Linux平台下被广泛支持。使用pthread库需要包含头文件,并在编译时加上-lpthread选项。使用pthread库可以创建、终止、等待、同步和管理线程。

u012151242的博客 1092

sec_uid

webcast_uid转sec_uid,webcast_uid转uid,webcast_uid转dy号

m0_56967679的博客 4420

操作系统实验:实现银行家算法

1 实验题目要求 1.1 查看P231页中编程项目,里面有对银行家算法的具体要求,特别要注意实现部分。 注意命令行参数 ./a.out 10 5 7 仅是个列子,你所涉及的程序需要支持n个线程对m中资源的并发访问请求,因此需要对上面的命令行进行扩展。 1.2 在实验过程中,能够通过屏幕或者文件,保存每个客户线程申请资源的情况—申请多少;是否被分配等。(每个客户线程每次申请资源量不超过它们的need数组相应值)。 1.3 完成的报告需要有详细的设计、代码及注释、实验结果及分析说明。 2 准备知识 2.1 .

正在自我救赎的菜鸟。本人所有内容均不收费,可随意转发,复制 1万+

非洲秃鹫优化算法(AVOA)详解:从原理到实战

非洲秃鹫优化算法(AVOA)是一种模拟秃鹫觅食行为的元启发式算法。该算法通过数学建模秃鹫的群体分工、饥饿感知和食物竞争等行为,将优化问题转化为智能觅食过程。AVOA包含四个关键阶段:(1)种群初始化与最佳秃鹫选择;(2)饥饿率控制探索与开发平衡;(3)探索阶段模拟远距离飞行搜索;(4)开发阶段模拟食物源附近的竞争行为。算法采用饥饿率函数实现自适应搜索,初期偏向全局探索,后期转向局部开发。实验表明AVOA在标准测试函数和工程设计问题上表现出优越性能,其创新性在于将秃鹫独特的生物学特性转化为高效的优化机制。

qq_42212808的博客 228

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

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

使用pthread库进行多线程编程1 - UNIX环境高级编程第11章读书笔记

11 Threads1 Introduction不用介绍了吧…2 Thread Concepts1.     Thread由下面部分组成:a.     Thread IDb.     Stackc.     Policyd.     Signal maske.     Errnof.      Thread-Specific Data3 Thread I

张羿的优快云专栏 7556

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++ 多线程编程(二):pthread的基本使用

pthread中的p是POSIX的缩写,而POSIX是Portable Operating System Interface的缩写,是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称。(Windows环境下无pthread,Linux GCC4.6以下编译需加-pthread编译选项)std::thread是C++11中的新特性,将多线程程序的编写提升到了语言层面,使得编写的多线程程序的可移植性大大提高。

海纳百川,有容乃大。 2万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C语言多线程编程为什么要用pthread_join函数

如果你用的是LINUX/UNIX/MacOSX,那么我们已经可以开始了,如果你用的是WINDOWS,那么你需要从网站上下载PTHREAD的WINDOWS开发包,所幸他非常的小。网站地址是http://sourceware.org/pthreads-win32/先来看一个基本的例子: 程序代码#include #include using namespace std;void* tpro

boy8239的专栏 1万+

UNIX环境高级编程——pthread_create的问题

linux 下常用的创建多线程函数pthread_create(pthread_t * thread , pthread_attr_t * attr , void *(*start_routine)(void*) , void *args);其中第一个参数用来保存线程信息,第二个参数指新线程的运行属性,可以设置为NULL,第三个参数为自定义的线程函数,第四个参数就是线程函数需要用到的参数,一般如果

ctthuangcheng 1649

Unix环境高级编程-学习-10-多线程之条件变量(补充)

本文介绍Unix环境高级编程-多线程之条件变量的相关函数,包含:声明、作用、参数、返回值、注意点、相关宏等。

qq_45111959的博客 1159

《UNIX 环境高级编程》学习笔记——线程

UNIX环境高级编程——线程 学习参考资料: 《UNIX 环境高级编程》第3版

weixin_45243288的博客 859

《UNIX高级环境编程》(第二版)勘误表

注:因最近学习《UNIX高级环境编程》(第二版)时发现里边有些代码不能理解,查了很多资料也没有很好的解释,最终查到了本书的勘误,现与大家分享一下,希望对学习这本书的朋友有所帮助。 The following errors were fixed in the second printing. 1、     Page 413, third paragraph. If a signa

daemon_msg的专栏 1085
上一篇: Mac OS X Programming读书笔记5 - Controls
下一篇: Rotor实现中用到的Macro(摘自Shared Source CLI Essentials)
ATField
博客等级 码龄25年 673粉丝 119原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值