
多线程技术
文章平均质量分 63
LceChan
这个作者很懒,什么都没留下…
展开
-
条件变量详细解说
条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用。条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以通过允许线程阻塞和等待另一个线程发送信号来弥补互斥锁的不足,所以互斥锁和条件变量通常一起使用。当条件满足的时候,线程通常解锁并等待该条件发生变化,一旦另一个线程修改了环境变量,就会通知相应的环境变量唤醒一个或者多个被这个条件变量阻塞的线程。这些被唤醒的线程将重新上锁,并测试条件是否满足。一般来说条件变量被用于线程间的同步;转载 2022-10-27 23:05:39 · 754 阅读 · 0 评论 -
互斥锁(mutex)
Linux中提供一把每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。但,应注意:同一时刻,只能有一个线程持有该锁。当A线程对某个全局变量加锁访问,B在访问前尝试加锁,拿不到锁,B阻塞。C线程不去加锁,而直接访问该全局变量,依然能够访问,但会出现数据混乱。所以,互斥锁实质上是操作系统提供的一把“建议锁”(又称“协同锁”),建议程序中有多线程访问共享资源的时候使用该机制。但,并没有强制限定。转载 2022-10-27 22:58:18 · 967 阅读 · 0 评论 -
什么是死锁,产生死锁的原因及必要条件
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。如下图所示:产生死锁的原因?a. 竞争资源系统中的资源可以分为两类:可剥夺资源,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺,CPU和主存均属于可剥夺性资源;......转载 2022-08-11 23:25:02 · 24156 阅读 · 0 评论 -
六种进程间通信方式
每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。Linux 内核提供了不少进程间通信的机制,我们来一起瞧瞧有哪些?如果你学过 Linux 命令,那你肯定很熟悉「」这个竖线。 上面命令行里的「」竖线就是一个管道,它的功能是将前一个命令()的输出,作为后一个命令()的输入,从这功能描述,可以看出管道传输数据是单向的,如果想相互通信,我们需要创建两个管道才行。同时,我们得知上面这种管道是没有名字,所以「」表示的管道称为匿转载 2022-06-26 09:30:59 · 2070 阅读 · 0 评论 -
进程与线程的关系
共享内存允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取错做读出,从而实现了进程间的通信。线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。2.线程是进程的一部分,一个线程只能属于一个进程,一个进程可以有多个线程,但至少有一个线程。原创 2022-06-19 22:02:58 · 10328 阅读 · 0 评论 -
线程同步的四种方式
线程同步转载 2022-06-19 14:53:38 · 23693 阅读 · 0 评论 -
【C/C++学习】之四种结束线程方式详解
线程退出方式原创 2022-06-19 10:55:28 · 9236 阅读 · 0 评论 -
多线程和多进程的区别(小结)
转自:http://blog.youkuaiyun.com/hairetz/article/details/4281931#comments一.为何需要多进程(或者多线程),为何需要并发?这个问题或许本身都不是个问题。但是对于没有接触过多进程编程的朋友来说,他们确实无法感受到并发的魅力以及必要性。我想,只要你不是整天都写那种int main()到底的代码的人,那么或多或少你会遇到代码响应不够用原创 2013-08-23 22:21:12 · 1776 阅读 · 0 评论 -
多线程中锁的实现
转自:http://blog.youkuaiyun.com/wtz1985/article/details/3015376所谓"锁",就是为了让自己独自占有空间,在自己没用完之前,不让别人来占用自己的资源.现在的操作系统,无论是WINDOWS,还是UNIX等其他操作系统.都采用多线程的环境.这极大提高了任务的执行速度,而且不会影响其他事务的执行.但是它们的执行是靠时间片的轮转的,如果某一个线程没有原创 2013-08-25 15:25:36 · 818 阅读 · 0 评论 -
多线程中递归锁的实现
转自:http://blog.youkuaiyun.com/wtz1985/article/details/3016375在上一篇文章中,我已经阐述了多线程中简单锁的实现,可在结束的时候,我就提了那么一个问题,那就是如果在一个链表中进行插入时,要进行查询的操作,如果只是简单的锁,是没法实现的。所以“递归锁”就浮现于世了。可能有些人看到递归这两个字,有点傻了眼,其实也没什么的,简单的介绍,就原创 2013-08-25 15:26:55 · 1292 阅读 · 0 评论 -
gdb调试多进程程序和多线程程序
平时一般用gdb直接调试短小的程序,好像我还没调试过多进程和多线程程序呢。 1. gdb调试多进程程序 如果一个进程通过fork系统调用创建了子进程,gdb会继续调试原来的进程,子进程则正常运行。常用的有两种方法调试子进程。 第一种:单独调试子进程 子进程在本质上也是一个进程,因此我们可以用gdb调试方法来调试。举个例子,运行程序,通过ps -ef转载 2013-08-27 23:40:02 · 700 阅读 · 0 评论 -
在多线程应用程序中使用循环缓冲区高效地进行日志记录
在多线程应用程序中使用循环缓冲区高效地进行日志记录在关键的计算机应用程序的生存期中,日志记录是一件非常重要的活动,特别是当故障的症状并不十分明显时。日志记录提供了故障前应用程序状态的详细信息,如变量的值、函数的返回值等等。在一段时间的运行过程中,将不断地产生大量的跟踪数据,并持续地将其写入到磁盘上的文本文件中。要进行有效的日志记录,需要使用大量的磁盘空间,并且在多线转载 2013-09-03 22:48:28 · 1695 阅读 · 0 评论 -
pthreads 的基本用法
转自:http://www.ibm.com/developerworks/cn/linux/l-pthred/index.html除了 Anne McCaffrey 的系列小说 Dragonriders of Pern 之外,“线程”是令程序员谈虎色变的词儿。线程有时称为轻型进程,是与大型复杂的项目相关的。调用库函数时经常会遇到一些“线程不安全”的可怕警告。但这些线程究竟是什么原创 2013-09-30 18:30:57 · 1570 阅读 · 0 评论 -
POSIX 线程详解 一种支持内存共享的简捷工具
转自:http://www.ibm.com/developerworks/cn/linux/thread/posix_thread1/线程是有趣的了解如何正确运用线程是每一个优秀程序员必备的素质。线程类似于进程。如同进程,线程由内核按时间分片进行管理。在单处理器系统中,内核使用时间分片来模拟线程的并发执行,这种方式和进程的相同。而在多处理器系统中,如同多个进程,线程实际上一样可以并原创 2013-09-30 18:32:51 · 703 阅读 · 0 评论 -
通用线程:POSIX 线程详解
转自:http://www.ibm.com/developerworks/cn/linux/thread/posix_thread3/条件变量详解在 上一篇文章结束时,我描述了一个比较特殊的难题:如果线程正在等待某个特定条件发生,它应该如何处理这种情况?它可以重复对互斥对象锁定和解锁,每次都会检查共享数据结构,以查找某个值。但这是在浪费时间和资源,而且这种繁忙查询的效率非常低。原创 2013-09-30 18:36:00 · 772 阅读 · 0 评论 -
Linux 线程实现机制分析
转自:http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/一.基础知识:线程和进程按照教科书上的定义,进程是资源管理的最小单位,线程是程序执行的最小单位。在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持SMP以及减小(进程/线程)上下文切换开销。无论按照怎样的分法,一个进程至少需要一个线程作原创 2013-09-30 18:38:07 · 849 阅读 · 0 评论 -
通用线程:POSIX 线程详解
转自:http://www.ibm.com/developerworks/cn/linux/thread/posix_thread2/互斥我吧!在 前一篇文章中 ,谈到了会导致异常结果的线程代码。两个线程分别对同一个全局变量进行了二十次加一。变量的值最后应该是 40,但最终值却是 21。这是怎么回事呢?因为一个线程不停地“取消”了另一个线程执行的加一操作,所以产生这个问题。现在原创 2013-09-30 18:34:11 · 814 阅读 · 0 评论 -
Linux多线程编程
转自http://www.cnblogs.com/skynet/archive/2010/10/30/1865267.html1、进程与线程进程是程序执行时的一个实例,即它是程序已经执行到何种程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位原创 2013-05-08 23:01:54 · 670 阅读 · 0 评论 -
CUDA开发环境配置
依次安装 Driver,Toolkit,SDK。注意最好安装路径中不含空格。使用开勇的CUDA_VS_Wizard (http://sourceforge.net/projects/cudavswizard/) 配置Visual Studio 2008的CUDA项目安装Visual AssistantX打开VS, 选择 工具->选项->项目与解决方案->VC++项目设置,在“C/C++文件原创 2014-02-23 19:58:26 · 1131 阅读 · 0 评论 -
高性能网络编程5--IO复用与并发编程
对于服务器的并发处理能力,我们需要的是:每一毫秒服务器都能及时处理这一毫秒内收到的数百个不同TCP连接上的报文,与此同时,可能服务器上还有数以十万计的最近几秒没有收发任何报文的相对不活跃连接。同时处理多个并行发生事件的连接,简称为并发;同时处理万计、十万计的连接,则是高并发。服务器的并发编程所追求的就是处理的并发连接数目无限大,同时维持着高效率使用CPU等资源,直至物理资源首先耗尽。转载 2013-12-04 23:00:58 · 685 阅读 · 0 评论 -
C++任务队列与多线程
摘要: 很多场合之所以使用C++,一方面是由于C++编译后的native code的高效性能,另一方面是由于C++优秀的并发能力。并行方式有多进程 和多线程之分,本章暂且只讨论多线程,多进程方面的知识会在其他章节具体讨论。多线程是开发C++服务器程序非常重要的基础,如何根据需求具体的设计、分配线程以及线程间的通信,也是服务器程序非常重要的部分,除了能够带来程序的性能提高外,若设计转载 2013-11-11 21:26:07 · 1247 阅读 · 0 评论 -
gdb 多进程调试
我们先看看我们的测试程序:/* in eg1.c */int wib(int no1, int no2){ int result, diff; diff = no1 - no2; result = no1 / diff; return result;}int main(){ p转载 2013-11-10 16:21:43 · 608 阅读 · 0 评论 -
使用可重入函数进行更安全的信号处理
转自:http://www.ibm.com/developerworks/cn/linux/l-reent.html在早期的编程中,不可重入性对程序员并不构成威胁;函数不会有并发访问,也没有中断。在很多较老的 C 语言实现中,函数被认为是在单线程进程的环境中运行。不过,现在,并发编程已普遍使用,您需要意识到这个缺陷。本文描述了在并行和并发程序设计中函数的不可重入性导致的一些潜在原创 2013-09-27 23:57:20 · 737 阅读 · 0 评论 -
在 Linux 中处理来自共享对象的同步事件
转自:http://www.ibm.com/developerworks/cn/linux/l-syncevent.html在面向对象的系统中,当一个对象接收到一条消息时,可能会发生一系列的事件。通常,这些事件是以 同步(synchronous) 模式处理的:调用进程或向这个对象发送消息的线程在发送消息调用完成之前都会接收并处理一系列事件。然而,如果产生这些事件的对象是由多个进程进行共原创 2013-09-28 00:03:49 · 875 阅读 · 0 评论 -
服务器进程为何通常fork()两次
转自:http://blog.youkuaiyun.com/chdhust/article/details/11872467首先,要了解什么叫僵尸进程,什么叫孤儿进程,以及服务器进程运行所需要的一些条件。两次fork()就是为了解决这些相关的问题而出现的一种编程方法。孤儿进程 孤儿进程是指父进程在子进程结束之前死亡(return 或exit)。如下图1所示:原创 2013-09-25 21:27:10 · 811 阅读 · 0 评论 -
使用rpcgen构建分布式程序的一个简单例子
使用rpcgen构建分布式程序的一个简单例子一. RPC概念1.1 介绍 在中间件的实现中,引入了远程过程调用RPC(Remote Procedure Call)的概念。同时,许多分布式系统是基于进程间的显式消息交换的,然而消息的发送和接收过程无法隐藏通信的存在,而通信的隐藏对于在分布式系统中实现访问透明性是极为重要的。因此这个问题在很长一段时间内转载 2013-06-25 23:53:53 · 1548 阅读 · 0 评论 -
程序报错 undefined reference to `shm_open'
添加 -lrt库原创 2013-06-23 23:58:17 · 7326 阅读 · 0 评论 -
Posix共享内存区的基本操作
shmcreate程序#include #include #include #include #include #include /* For mode constants */#define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)int main(int argc, char** argv){ i原创 2013-06-24 00:25:07 · 897 阅读 · 0 评论 -
Posix消息队列的基本操作——发送消息
#include #include #include #include int main(int argc, char** argv){ mqd_t mqd; void *ptr; size_t len; size_t prio; if(argc != 4) { printf("usage: mqsend原创 2013-06-12 17:47:19 · 827 阅读 · 0 评论 -
Posix消息队列的基本操作——创建或打开
#include #include #include #include /* For O_* constants */#include /* For mode constants */#include #define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)struct mq_attr attr;原创 2013-06-12 14:25:32 · 785 阅读 · 0 评论 -
Posix消息队列的基本操作——获取消息属性
#include #include #include #include int main(int argc, char** argv){ mqd_t mqd; struct mq_attr attr; if(argc != 2) { printf("usage: mqgetattr "); } mqd = mq_o原创 2013-06-12 17:46:23 · 868 阅读 · 0 评论 -
Posix消息队列——mq_notify函数
Posix消息队列容许 异步事件通知,以告知何时有一个消息放置到某个空消息队列中,这种通知有两种方式可以选择:产生一个信号创建一个线程来执行一个指定的函数这种通知通过调用mq_notify建立#include int mq_notify(mqd_t mqdes, const struct sigevent* notification);该函数为指定队列建立或删除异步事件通知(原创 2013-06-12 21:46:12 · 3955 阅读 · 0 评论 -
Linux下的多线程编程
本文出自:http://www.china-pub.com 作者: 姚继锋 (2001-08-11 09:05:00)1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。现在,多线程技术已经被许转载 2012-04-30 09:45:20 · 527 阅读 · 0 评论 -
WIN32多线程四 线程同步机制Mutex(转)
Mutex与CriticalSection相似,都为了处理多个线程对资源的访问。区别是:mutex是内核对象,锁住mutex需要花费更多的时间,mutex可以跨进程存在。没有任何线程拥有mutex,这个mutex处于未激发状态,线程通过调用WaitForXXX来获得此mutex;除非这个线程ReleaseMutex,否则其他线程都不能获得这个mutex的拥有权。Mutex可以用来解决哲学家就餐原创 2011-04-27 23:41:00 · 1334 阅读 · 1 评论 -
WIN32多线程二 用WaitXXX函数等待线程结束(转)
等待线程结束的更好方法是调用API WaitForSigleObject和WaitForMultipleObjects。前者用于等待一个线程由未激发状态变为激发状态,后者用于等待多个线程中全部或多个中的一个由未激发状态变为激发状态。对线程内核对象而言,如果线程在运行,则是未激发状态;如果线程已经退出,则是激发状态。不同内核对象的激发、未激发状态含义有所不同。DWORD WINAPI Wai原创 2011-04-27 23:38:00 · 983 阅读 · 0 评论 -
WIN32多线程五 线程同步机制Semaphore(转)
大学操作系统教材里讲的最多的估计就是信号量Semaphore了,具体就不再介绍了,通常用来处理多线程访问多个资源的情况。实际上,如果创建一个信号量,并且它的最大计数是1,那么它就与Mutex等价。下面是个生产者-消费者问题的Win32程序,运行时的截图如下:代码如下:原创 2011-04-27 23:42:00 · 804 阅读 · 0 评论 -
WIN32多线程三 线程同步机制Critical Section(转)
就是通常说的"锁",多线程对同一份资源的同步控制,经常用Critical Section,用来锁住一份资源,以免多个线程"同时"访问一份资源。通过下面4个函数来使用InitializeCriticalSection EnterCriticalSection LeaveCriticalSection DeleteCriticalSection来使用。需要注意的地方:不要长时间的锁住一份资原创 2011-04-27 23:39:00 · 1073 阅读 · 0 评论 -
WIN32多线程一 用WIN32 API创建和结束线程(转)
Win32中,内核对象属于WINDOWS的,而不属于进程。进程对象、线程对象、文件对象、文件映射对象、事件对象、互斥量对象等都属于内核对象。WIN32中一般通过CreateXXXX来创建内核对象,返回一个内核对象的句柄,进程不能直接操作内核对象,只能通过该句柄来访问内核对象。内核对象有一个使用计数,一个进程的内核对象句柄表中引用了某个内核对象,该内核对象的使用计数就递增1,该进程调用CloseHa转载 2011-04-27 23:32:00 · 1413 阅读 · 0 评论 -
使用多线程的利弊
转自:http://software.intel.com/zh-cn/blogs/2013/04/09/?utm_campaign=优快云&utm_source=intel.youkuaiyun.com&utm_medium=Link&utm_content=%20Multicore%20-duoxiancheng1. Amdahl定律 一个很简单的量化公式,用来计算一个程序中串原创 2013-06-12 17:50:16 · 845 阅读 · 0 评论 -
打印线程ID
#include #include pthread_t ntid; void printids(const char* s){ pid_t pid; pthread_t tid; pid = getpid(); tid = pthread_self(); printf("%s pid %u tid %u (0原创 2013-06-02 22:03:59 · 3082 阅读 · 0 评论