c++ - 帮助使用信号量和线程

标签 c++ pthreads buffer

我正在使用 pthread 库来模拟线程缓冲区。我还使用信号量作为一次访问一个关键部分变量的解决方案。

主要问题是生产者填满了整个缓冲区,然后消费者清空了整个缓冲区。这段代码正确吗?我假设生产和消费会在缓冲区满或空之前发生。

这是我的代码,任何评论都会有很大帮助,是的,这是一个类(class)。

提前致谢

void *Producer(void *threadid) 
{
   long tid;
   tid = (long)threadid;

   while (c < Cycles)  //While stuff to buffer
   {                        
        pthread_mutex_lock(&lock);           
        while(size == BUFFER_SIZE)  
        {
           pthread_cond_wait(&cond, &lock);    
        }
     buffer [full] = rand();
     data << size+1 << ". Produce: " << buffer[full] << endl;
     printBuffer();
     full = (full + 1) % BUFFER_SIZE;
     size++;
     pthread_cond_signal(&cond1);
     pthread_mutex_unlock(&lock);
     c++;
   }
   pthread_exit(NULL);
}

您还可以下载所有代码或查看日志文件...

download main.cpp 在 funkohland.com/pthreads/log.txt 查看日志文件

最佳答案

这是互斥锁的一个众所周知的问题。 Mutex 是一项昂贵的操作,需要很多周期。当您解锁互斥锁时,另一个线程有一个微小的机会退出它的锁并获得锁。基本上,您需要在互斥体中花费更少的时间才能让另一个线程有机会运行。基本上,您需要选择实际上需要互斥锁的代码部分,然后快速锁定互斥锁,对那个变量执行任何您需要做的事情(仅此而已),然后解锁它。

关于c++ - 帮助使用信号量和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3184088/

相关文章:

C++0X 什么时候?

c++ - operator new 可以在施工完成前返回吗?

c++ - 英特尔 C++ 编译器是否有边界检查?

c - 在c中使用互斥锁进行多线程并一次运行一个线程

c++ - 为什么 MinGW-w64 浮点精度取决于 winpthreads 版本?

c - 如何正确扫描结构中定义的缓冲区?

c++ - 使用 TMP 预计算值何时真正有用?

c - pthread_cond_t 条件下的 volatile 变量

node.js - 使用缓冲区或流将 Webshot 传输到 Google Drive,无需存储中间文件?

c++ - 是否需要为 C/C++ 中的文件 I/O 操作创建自己的缓冲区?