pthread没有给出预期的输出
pthread not giving expected output
我正在尝试使用信号量和pthread实现生产者-消费者问题操作系统。但我的输出与预期完全不同。这是我的代码:
#include<iostream>
#include<pthread.h>
#include<fstream>
#include<unistd.h>
#include<queue>
// define queue size
#define QUEUE_SIZE 5
// declare and initialize semaphore and read/write counter
static int semaphore = 1;
static int counter = 0;
// Queue for saving characters
static std::queue<char> charQueue;
// indicator for end of file
static bool endOfFile = false;
// save arrays
char consumerArray1[100];
char consumerArray2[100];
// function to wait for semaphore
void wait()
{
while(semaphore<=0);
semaphore--;
}
// function to signal the wait function
void signal()
{
semaphore++;
}
void *Producer(void *ptr)
{
int i=0;
std::ifstream input("string.txt");
char temp;
while(input>>temp)
{
wait();
charQueue.push(temp);
//std::cout<<"Producer:nCounter: "<<counter<<" Semaphore: "<<semaphore<<std::endl;
counter++;
std::cout<<"Procuder Index: "<<i<<std::endl;
i++;
signal();
sleep(2);
}
endOfFile = true;
pthread_exit(NULL);
}
void *Consumer1(void *ptr)
{
std::cout<<"Entered consumer 1:"<<std::endl;
int i = 0;
while(counter<=0);
while(!endOfFile)
{
while(counter<=0);
wait();
//std::cout<<"Consumer1:nCounter: "<<counter<<" Semaphore: "<<semaphore<<std::endl;
consumerArray1[i] = charQueue.front();
charQueue.pop();
i++;
counter--;
std::cout<<"Consumer1 index:"<<i<<" char: "<<consumerArray1[i]<<std::endl;
signal();
sleep(2);
}
consumerArray1[i] = ' ';
pthread_exit(NULL);
}
void *Consumer2(void *ptr)
{
std::cout<<"Entered consumer 2:"<<std::endl;
int i = 0;
while(counter<=0);
while(!endOfFile)
{
while(counter<=0);
wait();
//std::cout<<"Consumer2:nCounter: "<<counter<<" Semaphore: "<<semaphore<<std::endl;
consumerArray2[i] = charQueue.front();
charQueue.pop();
i++;
counter--;
std::cout<<"Consumer2 index: "<<i<<" char: "<<consumerArray2[i]<<std::endl;
signal();
sleep(4);
}
consumerArray2[i] = ' ';
pthread_exit(NULL);
}
int main()
{
pthread_t thread[3];
pthread_create(&thread[0],NULL,Producer,NULL);
int rc = pthread_create(&thread[1],NULL,Consumer1,NULL);
if(rc)
{
std::cout<<"Thread not created"<<std::endl;
}
pthread_create(&thread[2],NULL,Consumer2,NULL);
pthread_join(thread[0],NULL);pthread_join(thread[1],NULL);pthread_join(thread[2],NULL);
std::cout<<"First array: "<<consumerArray1<<std::endl;
std::cout<<"Second array: "<<consumerArray2<<std::endl;
pthread_exit(NULL);
}
问题是我的代码,在某些运行中,在整个文件被读取后冻结(可能在无限循环中(。而且两个消费者函数都读取相同的单词,即使我在阅读后将其弹出。此外,打印已读取的数组元素的部分仅打印空白。为什么会出现这些问题?我是线程的新手(就像使用线程编码一样,我知道线程的理论概念(,所以请帮助我解决这个问题。
pthreads 标准禁止在一个线程中访问对象,而另一个线程正在或可能正在修改它。您的wait
和signal
函数违反了此规则,因为它会在调用wait
的线程可能正在访问semaphore
时修改(在signal
中(。你也用counter
这样做。
如果你在signal
和wait
所做的事情是合法的,你就不需要signal
和wait
。您可以像直接访问队列一样直接访问队列semaphore
。如果队列需要保护(我希望你知道它(,那么semaphore
也需要保护,并且出于完全相同的原因。
允许编译器优化此代码:
while(semaphore<=0);
对于此代码:
if (semaphore<=0) { while (1); }
为什么?因为它知道没有其他线程可以修改semaphore
而该线程可以访问它,因为这是标准禁止的。因此,没有理由多读一次。
您需要使用实际的sempahores和/或锁。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- pthread没有给出预期的输出
- pthread分配输出错误
- Pthread冻结标准输出
- 使用pthread的简单程序的输出
- 为什么' pthread '没有输出?
- 如何在c++中使用pthread或诅咒同时向屏幕输出多个字符串