pthread线程和主线程同步问题

主要实现如下功能:
1.初始化一组自定义对象;
2.pthread线程里建立socket获取json;
3.while循环不停的获取json,每获取一次就用postNotification通知主线程
4.主线程收到通知,解析json,设置一开始那组自定义对象状态;
部分代码如下:
初始化对象,之后启动线程建立socket获取数据,然后注册CCNotificationCenter

others = CCArray::createWithCapacity(14);
    
    CC_SAFE_RETAIN(others);
    
    for(int i=0;i<14;i++){
        Player* p = Player::create();
        p->retain();
        others->addObject(p);
    }

    ODSocket *pODSocket = ODSocket::sharedODSocket();
    
    pODSocket->msg_To_Sever = CCString::createWithFormat( "%s\r\n",roomid)->getCString();
    
    TigerThread tt;
    tt.threadStart();
    CCNotificationCenter::sharedNotificationCenter()->addObserver(this, callfuncO_selector(GameScene::getServerData), "receivedata", NULL);


```


子线程部分代码:
pthread_create(&mythead, &tAttr, thread_funcation, this);

void* TigerThread::thread_funcation(void *arg)
{
    ODSocket *pSocket = ODSocket::sharedODSocket();
    pSocket->Init();
    pSocket->Create(AF_INET, SOCK_STREAM,0);
    
    std::string rec_msg;
    int start;
    int end;
        if (pSocket->Connect("服务器ip", 端口)) {
            printf("connect done.");
    while (true) {
            char recvBuf = "\0";
            std::string testmsg= pSocket->msg_To_Sever;
            pSocket->Send(testmsg.data(),testmsg.length(),0);
            int ret = pSocket->Recv(recvBuf,2024,0);
        while(ret>0)
        {
            rec_msg=std::string(recvBuf);
            start = rec_msg.find("");
            end  = rec_msg.find("");
            //
            if(start!=-1&&start<end){
               
            break;
            }else{
                rec_msg = rec_msg.append(recvBuf,ret);
            }
        }
        
        start = rec_msg.find("")+5;
        end  = rec_msg.find("");
        
        CCNotificationCenter::sharedNotificationCenter()->postNotification("receivedata", (CCObject*)rec_msg.substr(start,end-start).c_str());
        
            if (ret==-1) {
                printf("server error");
                break;
            }
         }
        }
        else
        {
            CCLog("服务器连接失败");
        }
    pSocket->Close();
    pSocket->Clean();
    return NULL;

}



```


主线程收到通知后,在getServerData里处理other里的Player对象,就是出现各种莫名其妙的EXC_BAD_ACCESS,NaN,错误,每次还出现的不一样,感觉就像是没有同步好。
如果不用子线程,测试了一下直接设置others里的Player对象是正常的。

打断点看 p创建的时候有没有值。

创建的时候是有值的,但是取的时候,断点看就是NULL

那就比较诡异了。 需要贴全代码 看看, 还有 (player*) (others->objectAtIndex(0)); 要用括号括起来。

好像确实是其他地方的问题,我这段配合着多线程用的。测试了如果不用多线程就正常。我重新描述一下

CCNotificationCenter不是线程安全的 多半此原因造成

确实是。看看了捕鱼达人那个教程,分离的线程调用CCNotificationCenter确实需要处理,我再研究一下。

除了CCNotificationCenter之外,你的postNotification恐怕也有问题,c_str()返回的值在多于一个json的情况下会失效,你post过去的是一个马上失效的指针,只要处理多于一个json,恐怕即刻Exception. 老老实实New个对象出来再 post过去。

但是我post的只是一个字符串,还没有转换为json对象,会失效吗?不过没碰到这个问题,因为在还没处理json的时候,已经出现其他我说的那些莫名其妙的问题了…… :10: