随笔分类 - 多线程学习
摘要:——本文一个例子展开,介绍Linux下面线程的操作、多线程的同步和互斥。前言线程?为什么有了进程还需要线程呢,他们有什么区别?使用线程有什么优势呢?还有多线程编程的一些细节问题,如线程之间怎样同步、互斥,这些东西将在本文中介绍。下面是一道面试题:是否熟悉POSIX多线程编程技术?如熟悉,编写程序完成...
阅读全文
摘要:https://zh.wikipedia.org/wiki/%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8Bhttp://www.cnblogs.com/tianzhiliang/archive/2011/02/12/1952221.html
阅读全文
摘要:向题描述假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟 并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要有三种材料:烟草、纸和胶水。三个抽烟 者中,第一个拥有烟草、第二个拥有纸,第三个拥有胶水。供应者进程无限地提供三种材料, 供应者每次将两种材料放到桌子上,拥有剩下那种材料的抽烟者卷...
阅读全文
摘要:问题描述一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭,如图2-10所示。哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿的时候,才试图拿起左、 右两根筷子(一根一根地拿起)。如果筷子已在他人手上,则需等待。饥饿的哲学家只有同时拿到...
阅读全文
摘要:进程通信是指进程之间的信息交换。PV操作是低级通信方式,例如信号量,主要是进程间以及同一进程内不同线程之间的同步手段。髙级通信方式是指以较高的效率传输大量数据的通信方式。高级通信方法主要有以下三个类。共享存储在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行写/读操作实现进程之间的...
阅读全文
摘要:看一个较为复杂的生产者-消费者问题:问题描述桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等吃盘子中的橘子,女儿专等吃盘子中的苹果。只有盘子为空时,爸爸或妈妈就可向盘子中放一个水果;仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出。问题分析1...
阅读全文
摘要:问题描述有读者和写者两组并发进程,共享一个文件,当两个或以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。因此要求:①允许多个读者可以同时对文件执行读操作;②只允许一个写者往文件中写信息;③任一写者在完成写操作之前不...
阅读全文
摘要:生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同...
阅读全文
摘要:内核对象只是操作系统内核分配的一个内存块,并且只能由操作系统内核访问。该内存块是一种数据结构,它的成员负责维护该对象的各种信息。Windows提供一组函数创建和操作内核对象。调用一个创建内核对象的函数,函数会返回一个句柄,该句柄标识了这个内核对象,这个句柄可由当前进程中的所有线程调用。也可以通过跨进...
阅读全文
摘要:针对一个经典的线程同步互斥问题,前面几篇文章提出了四种解决方案:关键段、事件、互斥量、信号量。下面对这四种解决方案做一个总结,梳理一下知识点:首先来看下关于线程同步互斥的概念性的知识,相信大家通过前面的文章,已经对线程同步互斥有一定的认识了,也能模糊的说出线程同步互斥的各种概念性知识,下面再列出从《...
阅读全文
摘要:本篇文章介绍如何使用信号量解决线程的同步互斥。首先也来看看如何使用信号量,信号量Semaphore常用有三个函数,使用很方便。下面是这几个函数的原型和使用说明。第一个 CreateSemaphore函数功能:创建信号量函数原型:HANDLE CreateSemaphore( LPSECURITY_...
阅读全文
摘要:线程的实现方式线程的实现可以分为两类:用户级线程(User-LevelThread, ULT)和内核级线程(Kemel-LevelThread, KLT)。内核级线程又称为内核支持的线程。在用户级线程中,有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在。应用程序可以通过使用线程库设计成...
阅读全文
摘要:本篇通过互斥量来解决线程的同步,学习其中的一些知识。互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问。互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源。使用互斥量Mutex主要将用到四个函数。下面是这些函数的原型和使用说明。第一个 CreateMutex函数功...
阅读全文
摘要:使用关键段来解决经典的多线程同步互斥问题,由于关键段的“线程所有权”特性所以关键段只能用于线程的互斥而不能用于同步。本篇介绍用事件Event来尝试解决这个线程同步问题。首先介绍下如何使用事件。事件Event实际上是个内核对象,它的使用非常方便。下面列出一些常用的函数。第一个 CreateEvent函...
阅读全文
摘要:进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂。材料的地址:http://www.qnx.com/developers/docs/6.4.1/neutrino/getting_sta...
阅读全文
摘要:前面提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题。本文先介绍如何使用关键段,然后再深层次的分析下关键段的实现机制和原理。关键段CRITICAL_SECTION一共就四个函数,下面说一下这四个函数的原型和使用。函数功能:初始化函数原型:void ...
阅读全文
摘要:下面来看一个经典的多线程的同步和互斥的问题,问题的描述:主线程启动10个子线程并将表示子线程序号的变量的地址作为参数传递给子线程。子线程接收参数->sleep(50)->全局变量++->sleep(0)->输出参数和全局变量。要求:1. 子线程输出的线程序号不能重复2. 全局变量的输出必须是递增的下...
阅读全文
摘要:前面写了一个多线程报数的功能,为了描述方便和代码简洁起见,只输出最后的报数结果来观察程序运行结果。这非常类似一个网站的客户访问统计,每个用户登录用一个线程模拟,线程运行时将一个表示计数的变量递增。程序在最后输出这个计数的值表示今天有多少用户登录。如果这个值不等于我们启动的线程个数,那这个程序就是有问...
阅读全文
摘要:前言:之所以要学习一下多线程,最主要的目的是要学习多线程间的同步互斥等控制,而不是学习多线程本身,或者怎么用程序编写多线程。最重要的是利用程序控制多线程,防止在多线程环境中发生死锁的现象发生,这才是这个系列的笔记的中心,其它的都是了解的东西。人的精力和时间真的是有限的,至少我是这样的。所以抓住主线的...
阅读全文