pthread

Linux 多线程通信

岁酱吖の 提交于 2020-03-20 04:45:10
摘自资料(linux 与Windows不同) 线程间无需特别的手段进行通信,由于线程间能够共享数据结构,也就是一个全局变量能够被两个线程同一时候使用。只是要注意的是线程间须要做好同步,一般用mutex。能够參考一些比較新的UNIX/Linux编程的书,都会提到Posix线程编程,比方《UNIX环境高级编程(第二版)》、《UNIX系统编程》等等。 linux的消息属于IPC,也就是进程间通信,线程用不上。 linux用pthread_kill对线程发信号。 另:windows下不是用post..(你是说PostMessage吗?)进行线程通信的吧? windows用PostThreadMessage进行线程间通信,但实际上极少用这样的方法。还是利用同步多一些 LINUX下的同步和Windows原理都是一样的。只是Linux下的singal中断也非常好用。 用好信号量,共享资源就能够了。 使用多线程的理由之中的一个是和进程相比,它是一种非常"节俭"的多任务操作方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而执行于一个进程中的多个线程,它们彼此之间使用同样的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,并且

【Linux】线程----线程安全

懵懂的女人 提交于 2020-03-17 00:59:28
线程安全 概念 实现方法 互斥 互斥锁 互斥锁原理 互斥锁操作流程: 举例 死锁 死锁产生的必要条件: 预防死锁 避免死锁 同步 条件变量 条件变量提供的接口功能 例子 问题分析 注意 概念 多个执行流 对 临界资源 进行 争抢访问 ,而不会造成 数据二义性 或者 逻辑混乱 ,称这段争抢访问的过程是线程安全的。 实现方法 线程安全的实现: 同步 :通过 条件判断 ,实现对临界资源访问的时序合理性 互斥 :通过 唯一访问 ,实现对临界资源访问的安全性 互斥 互斥的实现技术: 互斥锁 、 信号量 实现互斥的原理:只要保证 同一时间只有一个执行流能够访问资源 就是互斥 对临界资源进行状态标记:没人访问的时候标记为1,表示可以访问;有人正在访问的时候,就标记为0,表示不可访问;在对 临界资源 进行 访问之前 先 进行状态判断 ,决定是否能够访问,不能访问则使其 休眠 。 互斥锁 互斥锁原理 互斥锁:其实就是一个 计数器 ,只有0/1的计数器,用于标记资源当前的访问状态 1----可访问 0----不可访问 互斥锁想要实现互斥,每个线程在访问临界资源之前都要先访问 同一个互斥锁 (加锁);意味着 互斥锁本身就是一个临界资源 (涉及到计数器的修改,修改过程必须保证安全,如果连自己都保护不了,如何保护他人?) 如果是普通的计数器,则操作步骤为 将mutex的值加载到CPU的一个寄存器

Linux 多线程通信

帅比萌擦擦* 提交于 2020-03-16 06:44:37
Linux 多线程通信 2008-03-13 11:01 19764人阅读 评论 (0) 收藏 举报 linux 多线程 thread join windows 编程 摘自资料(linux 与Windows不同) 线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用。不过要注意的是线程间需要做好同步,一般用mutex。可以参考一些比较新的UNIX/Linux编程的书,都会提到Posix线程编程,比如《UNIX环境高级编程(第二版)》、《UNIX系统编程》等等。 linux的消息属于IPC,也就是进程间通信,线程用不上。 linux用pthread_kill对线程发信号。 另:windows下不是用post..(你是说PostMessage吗?)进行线程通信的吧? windows用PostThreadMessage进行线程间通信,但实际上极少用这种方法。还是利用同步多一些 LINUX下的同步和Windows原理都是一样的。不过Linux下的singal中断也很好用。 用好信号量,共享资源就可以了。 使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式

Linux常用多线程函数

巧了我就是萌 提交于 2020-03-12 11:29:55
Linux多线程函数用得比较多的是下面的3个 pthread_create(),pthread_exit(),pthread_join();它们都是在头文件之中。编译时需要加静态库-lpthread 下面是函数的说明:   pthread_create是UNIX环境创建线程函数 int pthread_create( pthread_t *restrict tidp, const pthread_attr_t *restrict_attr, void*(*start_rtn)(void*), void *restrict arg); 返回值   若成功则返回0,否则返回出错编号   返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于制定各种不同的线程属性。新创建的线程从start_rtn函 数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把 这个结构的地址作为arg的参数传入。   linux下用C开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。   由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict

linux进程间的那些事儿

北城以北 提交于 2020-03-09 16:25:23
写这篇文章之前,我对linux的进程间通讯还是有些畏惧的,不过看了一些其它文章之后,觉得linux进程间远比我学到的要难得多,首先来说,linux下线程的概念被淡化了,线程又名轻量级进程。线程机制是现代编程技术中常用的一种抽象,提供了在同一程序中共享内存地址控件的一组线程。这些线程可以共享打开的文件和其它资源。线程机制支持并发程序涉及技术,可以保证真正并行处理。linux实现线程的机制非常独特,从内核的角度来说,没有线程这个概念,把所有线程当成进程来实现,内核并没有准备特别的数据结构来表示线程。相反,线程仅仅被视为一个与其它进程共享某些资源的进程,每个线程都拥有唯一率属于自己的task_struct,所以在内核中,看起来像一个普通的进程(只是该级才能哼和其它一些进程共享某些资源,如地址空间). 在windows或是sun solaris等操作系统中,提供了专门支持线程的机制,线程被抽象成一种耗费较少资源,执行迅速的单元。而对于linux来说,它只是一种进程间共享资源的手段。linux线程的创建和普通进程创建类似,只不过在调用clone的时候需要传递一些参数来指明需要共享的资源 clone(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND,0); 而一个普通的fork实现 clone(SIGCHLD,0) 而vfork的实现是 clone

条件变量实现生产者和消费者

感情迁移 提交于 2020-03-08 22:37:08
条件变量不是锁,但也可以造成线程阻塞,通常与互斥锁配合使用,给多线程提供一个会和的场所 常用函数: int pthread_cond_destroy(pthread_cond_t *cond); int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr); 初始化:包括动态初始化和静态初始化 int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime); int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex); 函数作用: 1.阻塞等待条件变量满足 2.释放已掌握的互斥锁(解锁互斥量) 1 2 两步为原子操作 3.当被唤醒, pthread_cond_wait函数返回时,解除阻塞并重新获取互斥锁 int pthread_cond_broadcast(pthread_cond_t *cond); int pthread_cond_signal

Linux TCP server系列(4)-浅谈listen与大并发TCP连接

牧云@^-^@ 提交于 2020-03-06 04:39:37
背景: 服务器在调用 listen 和 accept 后,就会阻塞在 accept 函数上, accpet 函数返回后循环调用 accept 函数等待客户的 TCP 连接。如果这时候又大量的用户并发发起 connect 连接,那么在 listen 有队列上限 ( 最大可接受 TCP 的连接数 ) 的情况下,有多少个 connect 会成功了。试验证明,当连接数远远高于 listen 的可连接数上限时,客户端的大部分 TCP 请求会被抛弃,只有当 listen 监听队列空闲或者放弃某个连接时,才可以接收新的连接,那么我们应该如何来避免这种情况出现? 分析: (一)客户端 客户端运行初期完成所设定的一定量的 socket 创建和相应的处理线程的创建 ,然后使用 条件变量来完成线程同步 ,直到最后一个线程创建完成,才 向所有线程发出广播通知,让所有线程并发调用 connect ,连接成功则关闭连接,失败则返回,如下代码所示。 socket 创建和线程创建: int testCount=300; // 并发用户数 /* 每个进程需要自己独立的栈空间, linux 下默认栈大小是 10M ,在 32 位的机子上一个进程需要 4G 的内存空间,去掉自己的栈空间全局程序段空间,一般只有 3G 内存可以用,创建线程时就需要从这 3G 的空间中分配 10M 出来,所以最多可以分配 300 个线程

Linux中的线程局部存储(一)

∥☆過路亽.° 提交于 2020-03-05 09:43:37
在 Linux系统中使用C/C++进行多线程编程时,我们遇到最多的就是对同一变量的多线程读写问题,大多情况下遇到这类问题都是通过锁机制来处理,但这对 程序的性能带来了很大的影响,当然对于那些系统原生支持原子操作的数据类型来说,我们可以使用原子操作来处理,这能对程序的性能会得到一定的提高。那么对 于那些系统不支持原子操作的自定义数据类型,在不使用锁的情况下如何做到线程安全呢?本文将从线程局部存储方面,简单讲解处理这一类线程安全问题的方法。 一、数据类型 在C/C++程序中常存在全局变量、函数内定义的静态变量以及局部变量,对于局部变量来说,其不存在线程安全问题,因此不在本文讨论的范围之内。全局变量 和函数内定义的静态变量,是同一进程中各个线程都可以访问的共享变量,因此它们存在多线程读写问题。在一个线程中修改了变量中的内容,其他线程都能感知并 且能读取已更改过的内容,这对数据交换来说是非常快捷的,但是由于多线程的存在,对于同一个变量可能存在两个或两个以上的线程同时修改变量所在的内存内 容,同时又存在多个线程在变量在修改的时去读取该内存值,如果没有使用相应的同步机制来保护该内存的话,那么所读取到的数据将是不可预知的,甚至可能导致 程序崩溃。 如果需要在一个线程内部的各个函数调用都能访问、但其它线程不能访问的变量,这就需要新的机制来实现,我们称之为Static memory local to

Linux C编程一站式学习

笑着哭i 提交于 2020-03-05 06:26:42
宋劲杉 北京亚嵌教育研究中心 < songjinshan AT akaedu DOT org > 版权 © 2008, 2009 宋劲杉, 北京亚嵌教育研究中心 http://learn.akae.cn/media/index.html ps -ef|grep sctp grep 全称是Global Regular Expression Print,表示全局正则表达式... SS7 GDB调试又看一遍。迅速用起 pthread_cond_timedwait 条件变量是利用线程间共享的 全局变量 进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争, 条件变量 的使用总是和一个 互斥锁 结合在一起。 pthread_cond_t ; / 这几天看man 看得头疼 pthread_cond_destroy, pthread_cond_init - destroy and initialize condition variables 太man太english... sigfillset 所有加入set 的信号量标志位1 它是一个宏实现  #define sigfillset(ptr) ( *(ptr) = ~(sigset_t)0, 0) 来源: https://www.cnblogs.com

线程共享全局变量和私有全局变量

戏子无情 提交于 2020-03-04 03:46:27
共享全局变量实例: #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <stdlib.h> int key=100; void *helloworld_one(char *argc) { printf("the message is %s\n",argc); key=10; printf("key=%d, the child is %u\n",key,pthread_self()); return 0; } void *helloworld_two(char *argc) { printf("the message is %s\n",argc); sleep(1); printf("key=%d, the child is %u\n",key,pthread_self()); } int main() { pthread_t thread_id_one; pthread_t thread_id_two; pthread_create(&thread_id_one,NULL,helloworld_one,"helloworld"); pthread_create(&thread_id_two,NULL,helloworld_two,"helloworld"); pthread_join