当前位置:  技术问答>linux和unix

c++ 多线程控制问题

    来源: 互联网  发布时间:2016-10-28

    本文导语:  主线程创建一个子线程,然后子线程调用 pthread_cond_wait()挂起; 主线程调用 pthread_cond_signal()换起子线程! 问题是主线程pthread_cond_signal() 执行了,但子线程没有被换起。 另外 myRtspServer 是类名,        pthread_m...

主线程创建一个子线程,然后子线程调用 pthread_cond_wait()挂起;
主线程调用 pthread_cond_signal()换起子线程!
问题是主线程pthread_cond_signal() 执行了,但子线程没有被换起。

另外 myRtspServer 是类名,       
pthread_mutex_t condition_mutex;
pthread_cond_t  condition_cond;
bool isStopStreamer;
bool isWaitingWakeup;   
都是类的私有变量。

程序如下:

//子线程

void* myRtspServer::StartG711RtpThread(void* arg)
{
    printf("in StartG711RtpThreadn");
    int ret;
    myRtspServer* g711RtpServer = (myRtspServer*)arg;
    for(;;)
    {
        ret = pthread_mutex_lock( &g711RtpServer->Return_condition_mutex() );
        if(ret == 0)
        {
            printf("pthread_mutex_lock sucessn");
        }
        if(g711RtpServer->Return_isStopStreamer() == true)
        {
            g711RtpServer->Set_isWaitingWakeup(true);
            printf("begin to wait for the conditionsn");
            ret = pthread_cond_wait( &g711RtpServer->Return_condition_cond(), &g711RtpServer->Return_condition_mutex());
            if(ret == 0)
            {
                printf("pthread_cond_wait sucessn");
            }
            printf("get the conditionsn");
            g711RtpServer->Set_isWaitingWakeup(false);
        }
        ret = pthread_mutex_unlock( &g711RtpServer->Return_condition_mutex());
        if(ret == 0)
        {
            printf("pthread_mutex_unlock sucessn");
        }
        g711RtpServer->Return_g711RtpStreamer()->DealWithG711Rtp();
        g711RtpServer->Return_g711RtpStreamer()->IncreaseTimeStamp(320);
        usleep(35000);
    }
    pthread_exit(NULL);
}



//主线程
void myRtspServer::DoEventLoop()
{
    //开线程---
    int ret;
    pthread_t id2;
    ret=pthread_create(&id2,NULL,StartG711RtpThread,this);
    if(ret!=0)
    {
        printf ("Create pthread error!n");
        exit (1);
    }
    printf("create StartG711RtpThread sucessfuln");
    for(;;)
    {
        InitSelect();
        OnSelect();

        if(sessionChain->ReturnSession_Counter() == 0)
        {
            printf("non connection is existn");
            isStopStreamer = true;
        }

        pthread_mutex_lock( &condition_mutex );
        if( isWaitingWakeup == true )
        {
            printf("begin to send signaln");
            ret = pthread_cond_signal( &condition_cond );
            if(ret == 0)
            {
                printf("pthread_cond_signal sucessn");
            }
        }
        pthread_mutex_unlock( &condition_mutex );
    }
    //sessionChain->PrintfTest();
}

|
返回类的私有成员是破坏类的封装性,最好不要这样做

|
帮顶一下先,

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问谁知道哪能找到“POSIX多线程程序设计”么?
  • 刚刚接触Unix系统和Unix编程。急需Unix下多线程程序设计和网络Socket程序设计方面的资料。
  • 用C语言写了一个多线程序下载器,下载速度快的无与伦比,大小只有86K,可下载任何文件!(免费+开源)
  • 真心求助:各位大哥能帖一个 socket 程序的例子吗?(要是多线程序的),分少了开帖再加!谢谢!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3