上一篇博客中讲到用msg实现多线程之间的消息传递,因为我只是把网络接收的数据发给主线程,或者主线程有数据需要负责网络的子线程去发送,主程看了我的代码后说我是“杀鸡用了个宰牛的刀”,于是,我并没有使用msg,跨平台不太方便也是一方面的原因。
实现这个功能用STL也是可以的。非常简单,说一下做法,就不写具体的代码了,如果我说的不清楚请评论里留言啦~
假设是主线程要给子线程发送数据,创建一个全局的容器变量(至于用vector还是list或者deque啊就自行决定吧),如果有数据要发送了就把它存到容器中,在子线程中需要一个while(true)的循环,一直去读这个容器中有没有数据,有就读出来(注意要把数据取出来),没有就继续循环。特别强调的是不论是主线程还是子线程对容器的访问都是要加锁的。我暂时是这么实现的~
如果是子线程给主线程发消息就不能使用while(true)了,否则UI显示会在while循环里卡住的,我的实现是子线程用notificationcenter给主线程发送一个消息,然后主线程从容器中读取数据。
也向王哲大神请教过线程通信这个问题,下面贴出他给出的建议
多线程方面的消息传递方面,目前cocos没有封装这块。你可以参考标准的“生产者-消费者模型”来实现。网上可以搜到很多实现。另外,我在2.x版本里面的写的 https://github.com/cocos2d/cocos2d-x/blob/master/extensions/network/HttpClient.cpp 这个也可以参考一下,没有做很纯粹的封装,不过用 CCArray 做了两个队列,在网络和UI线程里面分别用pthread_mutex_lock/unlock 加锁解锁。