如何在C ++中为三个线程使用适当的锁互斥函数?

时间:2015-03-21 18:32:29

标签: c++ c pthreads

我对线程有疑问,但我认为很难解释,所以请耐心等待。

我在QT / C ++程序中有两个pthread和一个信号,Signal填充一个缓冲区,一个线程复制缓冲区,一个线程处理缓冲区的数据。

fill buffer1 ----Copy buffer1 to buffer2----process the buffer's 2 data

信号功能:

void MainWindow::TcpData()
{
if(socket->bytesAvailable()>(DATA_LEN)) {
    QByteArray array = socket ->readAll();
    if(pthread_mutex_trylock(&data_mutex)==0)
    {
         if((p+array.size())<(MAX_TCP_BUFFER_SIZE+100))
         {   
                memcpy(BUFFER+p,array.data(),array.size());
                p+=array.size();
         }
         else {     
                p=0;
                memcpy(BUFFER,array.data(),array.size());
                p+=array.size();
              }

    pthread_mutex_unlock(&data_mutex);

    }
}
}

主题1:

void *MainWindow::copyTCPdata() {
pthread_mutex_lock(&data_mutex);
while(1) {
    if(data_ready) {
   pthread_cond_wait(&data_cond,&data_mutex);
   continue;
   }
/* Move the last part of the previous buffer, that was not processed,
 * on the start of the new buffer. */
memcpy(data, data+DATA_LEN, (FULL_LEN-1)*4);
/* Read the new data. */
memcpy(data+(FULL_LEN-1)*4, BUFFER,DATA_LEN);
memcpy(BUFFER,BUFFER+DATA_LEN,p);
if(p>DATA_LEN) p=p-DATA_LEN;
data_ready = 1;      

pthread_cond_signal(&data_cond);

pthread_mutex_unlock(&data_mutex);

  } }

主题2:

void *MainWindow::processData {
   while(1) {

    if(!data_ready) {
        pthread_cond_wait(&data_cond,&data_mutex);
        continue;
    }
    data_ready = 0;
    pthread_cond_signal(&data_cond);

    pthread_mutex_unlock(&data_mutex);
    detectSignal(data);
    pthread_mutex_lock(&data_mutex);


}

}

我认为用这种方式丢失数据,但程序更稳定,有人可以建议我更好的解决方案吗?

0 个答案:

没有答案