我是多线程编程的新手(实际上,我并不是多线程编程的新手,但是我总是使用全局数据来读写线程,我认为这会使我的代码难看又慢,我很渴望以提高我的技能)
并且我现在正在使用c ++开发转发器服务器,为简化问题,我们假设只有两个线程,一个接收线程和一个发送线程,并且,像往常一样愚蠢的设计,我有一个全局std ::保存数据列表:(
receiving-thread
从服务器读取原始数据并将其写入全局std :: list。
sending-thread
读取全局std :: list并将其发送给多个客户端。
我pthread_mutex_lock
用来同步全局std :: list。
问题是,转发服务器的性能很差,在receiving-thread
写入时锁定了全局列表,但是当时我sending-thread
想读取,因此必须等待,但是我认为这种等待是没有用的。
我应该怎么做,我知道全局变量是不好的,但是如果没有全局变量,我该如何同步这两个线程?
我会继续从SO和Google进行搜索。
任何建议,指南,技术或书籍将不胜感激。谢谢!
编辑
笔记:
答案:
是的,您应该同步访问共享数据。
请考虑以下代码段:
std::list g_list;
void thread1()
{
while( /*input ok*/ )
{
/*read input*/
g_list.push_back( /*something*/ );
}
}
void thread2()
{
while( /*something*/ )
{
/*pop from list*/
data x = g_list.front();
g_list.pop_front();
}
}
除非您真的知道自己在做什么,否则不要在C ++中使用pthread_ *-使用std :: thread(c ++ 11)或boost :: thread-或将pthread_ *自己包装在类中-因为如果您不考虑异常你最终会陷入僵局
在此特定示例中,您无法摆脱某种形式的同步-但您可以优化同步
仅在您实际访问std :: list时锁定-但不要犯此错误:
{
// lock
size_t i = g_list.size();
// unlock
if ( i )
{
// lock
// work with g_list ...
// unlock
}
}
这里更合适的模式是消息队列-您可以使用互斥锁,列表和条件变量来实现一个消息队列。您可以查看以下一些实现:
还有原子容器的选项,请看:
您还可以采用boost :: asio的异步方法-尽管正确完成您的案例应该很快。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句