摘要: 多线程中,常见的一种问题除了竞态条件外就是死锁。那什么是死锁呢?死锁就是:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。那么为什么会产生死锁呢?1.因为系统资源不足。2.进程运行推进的顺序不合适。3.资源分配不当。这个定义可能有点拗口,一个最简单的例子就是有资源A和资源B,都是不可剥夺资源,现在进程C已经申请了资源A,进程D也申请了资源B,进程C接下来的操作需要用到资源B,而进程D恰好也在申请资源A,那么就引发了死锁。这个肯定每个人都看过了。然后套用回去定义:如果一个进程集合里面(进程C和进程D)的每个进程(进程C和进程D)都在 阅读全文
posted @ 2013-07-15 20:57 一枚程序员 阅读(976) 评论(0) 推荐(0) 编辑
摘要: 为了能够有效的控制多个进程之间的沟通过程,保证沟通过程的有序和和谐,OS必须提供一定的同步机制保证进程之间不会自说自话而是有效的协同工作。比如在共享内存的通信方式中,两个或者多个进程都要对共享的内存进行数据写入,那么怎么才能保证一个进程在写入的过程中不被其它的进程打断,保证数据的完整性呢?又怎么保证读取进程在读取数据的过程中数据不会变动,保证读取出的数据是完整有效的呢?常用的同步方式有: 互斥锁、条件变量、读写锁、记录锁(文件锁)和信号灯。。1、互斥锁顾名思义,锁是用来锁住某种东西的,锁住之后只有有钥匙的人才能对锁住的东西拥有控制权(把锁砸了,把东西偷走的小偷不在我们的讨论范围了)。所谓互斥, 阅读全文
posted @ 2013-07-15 20:48 一枚程序员 阅读(4745) 评论(0) 推荐(1) 编辑
摘要: 一般我们写的程序都是以单个进程的方式来运行的,比较少涉及到多进程。特别是在windows下,因为Windows是按照线程来分配CPU时间片的,线程是最小的调度单位,所以在Windows下更多的用到多线程,在同一个进程里创建多个线程来执行不同的任务,达到充分利用CPU的目的。线程之间可以共享进程的资源,比如内存、变量,但是多线程有一个不好的地方,由于这些线程是在同一个进程空间里执行,所以只要一个线程崩溃,整个进程也就崩溃了,程序就退出了。多进程由于是在不同的进程空间里,一个进程崩溃,不会影响到其它的进程,但是进程之间要交换信息的话,就比较麻烦了,不像多线程可以简单的通过一个全局变量来通讯。为了解 阅读全文
posted @ 2013-07-15 20:38 一枚程序员 阅读(3416) 评论(0) 推荐(0) 编辑
摘要: 当线程分属于不同进程,也就是分驻在不同的地址空间时,它们之间的通讯需要跨越地址空间的边界,便得采取一些与同一进程中不同线程间通讯不同的方法。在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯。常用的方法有:1、使用内存映射文件2、通过共享内存DLL共享内存3、使用SendMessage向另一进程发送WM_COPYDATA消息比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一中方法。WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。Windows在通过WM_COPYDATA消息传递期间,不提供继承同步方式。SDK文档推荐用户使用SendMess 阅读全文
posted @ 2013-07-15 20:34 一枚程序员 阅读(418) 评论(0) 推荐(0) 编辑
摘要: 一、单选题1、在常用的网络协议中,___是面向连接的、有重传功能的协议。A、IP B、TCP C、UDP D、DXP分析:TCP协议为传输控制协议面向连接,IP为网际协议,UDP为用户数据报协议。。2、500张多米诺骨牌整齐地排成一列,依顺序编号为1、2、3……499、500。第一次拿走所有奇数位置上的骨牌,第二次再从剩余骨牌中拿走所有奇数位置上的骨牌,依此类推。请问最后剩下的一张骨牌的编号是多少?A、128 B、250 C、256 D、500分析:第一次后剩下250个偶数 2 4 6...500,将它们除以2得到1~250的一列,以此类推8次,最后剩余1,即1×2^8=256(最. 阅读全文
posted @ 2013-07-15 11:45 一枚程序员 阅读(6738) 评论(8) 推荐(3) 编辑
摘要: 题目原文:Describe how you could use a single array to implement three stacks.译文:你如何只用一个数组实现三个栈?解答我们可以很容易地用一个数组来实现一个栈,压栈就往数组里插入值,栈顶指针加1; 出栈就直接将栈顶指针减1;取栈顶值就把栈顶指针指向的单元的值返回; 判断是否为空就直接看栈顶指针是否为-1。如果要在一个数组里实现3个栈,可以将该数组分为3个部分。如果我们并不知道哪个栈将装 入更多的数据,就直接将这个数组平均分为3个部分,每个部分维护一个栈顶指针, 根据具体是对哪个栈进行操作,用栈顶指针去加上相应的偏移量即可。代码如 阅读全文
posted @ 2013-07-15 10:06 一枚程序员 阅读(425) 评论(0) 推荐(0) 编辑