存档

作者存档

实际系统中的调度

2010年2月26日 行者 没有评论

  我们已经谈过调度算法以及线程状态,但是我们还没有说过线程等重新调度的原因与时间。有一个常见的误解就是:重新调度的发生是没有什么原因的。这在设计阶段是一个有用的概念。但是更重要的是你要知道产生重新调度的条件。

  重新调度只会由于以下几个原因才会发生:

阅读全文…

线程池(Pools of threads)

2010年2月26日 行者 没有评论

  在编程中你可能注意到你想要能够运行多个线程,并且你也想在某个限度上控制这些线程的行为。例如,在一个服务器中,你可能决定只让一个线程阻塞,等待来自客户端的一个消息。当这个线程获得了消息并开始处理这个请求的时候,你可能需要再创建一个新的线程来等待下一个请求的到来,以便在新的请求到了的时候由这个线程完成相应的处理。如此下来,过了一段时间所有的请求都被处理之后,你就会有多个线程在那里等待后续的客户端请求了。为了保护资源,你可能需要杀掉一些多余的线程。

  这其实是一个常见的操作,Neutrino实时系统也提供了一个库来帮助处理这些操作。

  现在需要注意的是这些线程池中的线程做了两个不同的操作:

阅读全文…

用于线程同步的条件变量(Condition Variables)

2010年2月24日 行者 没有评论

  条件变量(condition variables或condvars)与前面讲的睡眠锁(sleepon lock)非常类似。而实际上睡眠锁是在条件变量的基础上构建的,这也是为什么我们在睡眠锁的例子的解释表中有一个CONDVAR状态。它也能通过不停的调用pthread_cond_wait()函数来释放互斥体、等待以及重新获取互斥体,和pthread_sleepon_wait()函数一样。

  下面我们就略过初始化的步骤,并使用条件变量来重新完成sleepon部分的那个生产者与消费者的多线程的程序。之后再讨论调用的函数。

阅读全文…

用于线程同步的Sleepon锁

2010年2月23日 行者 没有评论

  在多线程程序中常遇到的另外一个情况就是让线程等待某件事的发生。这件事可以是任何事。它可以是设备上的数据就绪了,也可以是传送带到达了合适的位置或数据已经写入磁盘了,等等。另外还要讨论一下多个线程等待某个事件的情况。

  为了实现这个功能,我们可以使用条件变量(condition variable)或是更简单的睡眠锁(sleepon lock)。

  要使用睡眠锁,你需要执行几个操作。先看看要调用的函数,之后再看看你该如何使用这个锁:

阅读全文…

用于线程同步的读写锁(Readers/writer locks)

2010年2月21日 行者 没有评论

  读写锁(readers/writer lock)的具体含义是文如其名:对一个资源有多个读者而无写入者,或者是只有一个写入者而没有其他的写入者或读出者。

  这种情况是经常会用到的,这就需要有一种专用于这个目的的特殊的同步元素。

  很多情况下,你需要有个数据结构在一堆线程之间共享。当然,你希望在一个时刻只能有一个线程可以对这个数据结构执行写入操作。如果同时有多个线程能对其写入,那么就有可能一个线程写入的数据会覆盖其他线程所写入的数据。为了防止这种情况发生,写线程可以用独占的方式获取“读写锁”,也就是说只有它才能够访问这个数据结构。不过需要注意这个访问的独占性严格受控于随意的方式。也就是说这是由系统设计者来处理的,是由系统设计者来确保所有访问那个数据区域的线程通过读写锁进行同步。

阅读全文…