第八步:编写任务间通信机制如消息队列等

 

利用Mutex对象和Semaphore对象,就可以很容易地实现一个消息队列对象。方法如下:

 

使用一个链表来实现队列,并且用一个Mutex对象来保护堆这个链表的访问。然后,用一个Semaphore对象作为这个队列的计数器。当一条消息被放入这个队列时, 把Semaphore对象的计数加一,而当一条消息被取走的时候,Semaphore对象的计数减一。如果队列中没有消息,Semaphore对象将阻塞接收线程。当消息到达时,Semaphore对象将resume阻塞的线程。 这样,利用Semaphore对象的计数特性就可以很容易地实现一个消息队列。这个消息队列的实现代码在msgqueue.c中。

 

msgqueue.c中实现的消息发送函数是把一条消息发送给一个消息队列对象的,而不是发送到一个线程。如果要实现把消息发送给一个线程,就需要支持线程的私有消息队列,并把消息发送到这个私有队列。 TaskMsg.c就实现了一个支持线程私有队列的机制。当一个这样的线程被创建的时候,一个消息队列对象会被创建,并和这个线程关联起来。当这个线程结束的时候,这个消息对象会被自动释放。 当线程需要接受消息时,可以调用MsgThread_Receive函数。这个函数将调用MsgQueue_Receive函数接受线程私有队列的消息。当需要向其它线程发送消息时,可以调用MsgThread_Send函数。这个函数会找到iThreadIdentifier参数所指定的线程的私有队列,并且调用MsgQueue_Send函数将消息发送出去。

 

有一点需要注意的是,只有调用MsgThread_Create函数创建的线程才能支持线程私有队列,并从这个队列接受消息。

 

这一步的例子和上一步的例子还有一个不同,就是在线程管理系统中增加了对线程私有变量的支持。这一步的例子在taskmgr.c中增加了4个函数,它们是:Thread_AllocSharedSlot、Thread_FreeSharedSlot、Thread_GetSlot、Thread_SetSlot。 Thread_AllocSharedSlot函数用来分配线程私有变量,而Thread_FreeSharedSlot函数用来释放线程私有变量。Thread_GetSlot函数和Thread_SetSlot函数用来获取或设置这些变量的值。

 

关于这个机制的细节,将在下一步中介绍。

 

另外,这一步的例子增加了一个basedefs.h文件,把在各个源文件中分别定义的符号和类型统一定义在这个头文件中了。

 

下载这一步例子的源代码

 

下一步:对于实时处理的支持