多线程-如何实现线程之间高效率通讯?

多线程-如何实现线程之间高效率通讯?

灵芸 发布于 2017-03-27 字数 99 浏览 1057 回复 4

有两个线程A和B,线程A频繁的向线程B抛送消息,对线程B的消息队列采用哪种锁机制可以实现最高效率?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

灵芸 2017-10-19 4 楼

线程通讯有方式有以下几种:

1.消息通信
可以用PostMessage或PostThradMessage来向另外一个线程发送消息进行通信,利用现有的widnwos消息队列来完成工作,简单的逻辑处理可以采用这种方式,简单,易用,效率高

2.用事件对象实现通信

在线程之间传递信号进行通信比较复杂的方法是使用事件对象,事件对象处于两种状态之一:有信号和无信号,线程可以监视处于有信号状态的事件,以便在适当的时候执行对事件的操作。

3.线程之间的同步
临界区,互斥,信号量这些是用于线程共享资源的同步的。

线程之间的通讯要通过以上方式来实现,需要具体需求具体对待,在widnows平台上可以用InterlockedIncrement代替EnterCriticalSection,InterlockedIncrement是属于轻量级的锁,效率更高。

虐人心 2017-09-03 3 楼

如果都是消息队列,线程B是不用考虑同步机制的,因为win32对线程消息队列已经做了同步处理。

清晨说ぺ晚安 2017-08-16 2 楼

如果只是A和B两个线程,一个生产者一个消费者,应优先考虑无锁机制。

灵芸 2017-07-10 1 楼

这个涉及同步或互斥问题,是操作系统中的读者和写者问题。分两种情况,一种为两条线程在同一个进程,一种为不在同一个进程。
1.在同一个进程,可以使用两种机制同步。
1)信号量:在同步或互斥问题中最快的实现方式是信号量机制。因为它不像自旋锁去轮询等待,而是当资源准备好后,从等待队列中去唤醒阻塞的线程。A、B采用如下方式同步,这里假设消息保存在全局变量Global里,也可以写成结构体:

HANDLE m_hEventA = CreateEvent(NULL, FALSE, FALSE, NULL);
HANDLE m_hEventB = CreateEvent(NULL, FALSE, FALSE, NULL);

线程A:

DWORD dwResult=0;
while(!bQuit)
{
write Global; //伪代码
SetEvent(m_hEventA);
dwResult = WaitForSingleObject(m_hEventB, INFINITE);
if (dwResult== WAIT_FAILED ||dwResult== WAIT_ABANDONED)
return -1;
}

线程B:

 DWORD dwResult=0;
while(!bQuit)
{
dwResult = WaitForSingleObject(m_hEventA, INFINITE);
if (dwResult== WAIT_FAILED ||dwResult== WAIT_ABANDONED)
return -1;
read Global; //伪代码
SetEvent(m_hEventB);
}

2)SendMessage方式。SendMessage会等待接收线程处理玩此条消息后返回,接着再SendMessage下一条消息。与PostMessage不同,它投送消息到接收线程消息队列后立刻返回,不管接受线程处理没处理。

2.不在同一个进程的情况与情况1类似,只不过两个信号量m_hEventA、m_hEventB保存在共享内存中。而SendMessage的方式,第四个参数设置为COPYDATASTRUCT结构。