我正在使用 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/