C++11 中的生产者-消费者
Producer-Consumer in C++11
我已经开始学习线程操作,并从一个旨在生成随机大写字母的简单程序开始。这些字母是随机生成的,并通过生产者添加到一个 char 数组中,任何添加的字母都以小写形式输出。消费者只需从 char 数组中输出常规大写字母。到目前为止,我有以下内容:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <random>
std::mutex mtx;
std::condition_variable cv;
int count = 0, buff_size = 0;
char* buff;
int random_int(int lower_bound) {
std::random_device seed;
std::mt19937 generator(seed());
std::uniform_int_distribution<int> dist(lower_bound, std::nextafter(26, DBL_MAX));
return dist(generator);
}
char random_char(int lower_bound) {
return 'A' + (random_int(lower_bound) % 26);
}
/* Consumer
Reads characters from the buffer and prints them.
*/
void consume(int job) {
std::unique_lock<std::mutex> lck(mtx);
while (count == 0) {
cv.wait(lck);
}
/*
job + 1 = Running
job = Ready
*/
for (int i = 0; i < buff_size; i++) {
std::cout << buff[i] << std::endl;
}
count--;
}
/* Producer
Randomly generates letters at (pos > buff_size & pos <= 26),
inserts them at the next available position in the buffer,
and then prints out the lowercase form of the inputted letter.
*/
void produce(int job) {
std::unique_lock<std::mutex> lck(mtx);
for (int i = 0; i < buff_size; i++) {
buff[i] = random_char(buff_size);
std::cout << tolower(buff[i]) << std::endl;
}
count++;
cv.notify_one();
}
int main() {
int buf_size = 0;
std::cout << "The Producer-Consumer Problem (in C++11!)" << std::endl << "Enter the buffer size: ";
std::cin >> buf_size;
if (buf_size > 0 && buf_size <= 26) {
// set the buffer size
buff_size = buf_size;
buff = new char[buff_size];
}
else {
// rage quit
exit(1);
}
std::thread production[10], processed[10];
/* Initialize the arrays */
for (int order = 0; order < buff_size; order++) {
production[order] = std::thread(produce, order);
processed[order] = std::thread(consume, order);
}
/* Join the threads to the main threads */
for (int order = 0; order < buff_size; order++) {
processed[order].join();
production[order].join();
}
// free the allocated memory
delete[] buff;
}
然而,我的输出是大写字母和随机数的混合体。怎么了?这是我第一次尝试,所以要温柔。 :)
output however is a mixture of capital letters and random numbers.
查看 zch 评论。我认为他的意思是:
而不是:
std::cout << tolower(buff[i]) << std::endl;
尝试
std::cout << char(tolower(buff[i])) << std::endl;
或
std::cout << (char)tolower(buff[i]) << std::endl;
因为 C++ 标签,你也许应该使用 static_cast
std::cout << static_cast<char>(tolower(buff[i])) << std::endl;
我已经开始学习线程操作,并从一个旨在生成随机大写字母的简单程序开始。这些字母是随机生成的,并通过生产者添加到一个 char 数组中,任何添加的字母都以小写形式输出。消费者只需从 char 数组中输出常规大写字母。到目前为止,我有以下内容:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <random>
std::mutex mtx;
std::condition_variable cv;
int count = 0, buff_size = 0;
char* buff;
int random_int(int lower_bound) {
std::random_device seed;
std::mt19937 generator(seed());
std::uniform_int_distribution<int> dist(lower_bound, std::nextafter(26, DBL_MAX));
return dist(generator);
}
char random_char(int lower_bound) {
return 'A' + (random_int(lower_bound) % 26);
}
/* Consumer
Reads characters from the buffer and prints them.
*/
void consume(int job) {
std::unique_lock<std::mutex> lck(mtx);
while (count == 0) {
cv.wait(lck);
}
/*
job + 1 = Running
job = Ready
*/
for (int i = 0; i < buff_size; i++) {
std::cout << buff[i] << std::endl;
}
count--;
}
/* Producer
Randomly generates letters at (pos > buff_size & pos <= 26),
inserts them at the next available position in the buffer,
and then prints out the lowercase form of the inputted letter.
*/
void produce(int job) {
std::unique_lock<std::mutex> lck(mtx);
for (int i = 0; i < buff_size; i++) {
buff[i] = random_char(buff_size);
std::cout << tolower(buff[i]) << std::endl;
}
count++;
cv.notify_one();
}
int main() {
int buf_size = 0;
std::cout << "The Producer-Consumer Problem (in C++11!)" << std::endl << "Enter the buffer size: ";
std::cin >> buf_size;
if (buf_size > 0 && buf_size <= 26) {
// set the buffer size
buff_size = buf_size;
buff = new char[buff_size];
}
else {
// rage quit
exit(1);
}
std::thread production[10], processed[10];
/* Initialize the arrays */
for (int order = 0; order < buff_size; order++) {
production[order] = std::thread(produce, order);
processed[order] = std::thread(consume, order);
}
/* Join the threads to the main threads */
for (int order = 0; order < buff_size; order++) {
processed[order].join();
production[order].join();
}
// free the allocated memory
delete[] buff;
}
然而,我的输出是大写字母和随机数的混合体。怎么了?这是我第一次尝试,所以要温柔。 :)
output however is a mixture of capital letters and random numbers.
查看 zch 评论。我认为他的意思是:
而不是:
std::cout << tolower(buff[i]) << std::endl;
尝试
std::cout << char(tolower(buff[i])) << std::endl;
或
std::cout << (char)tolower(buff[i]) << std::endl;
因为 C++ 标签,你也许应该使用 static_cast
std::cout << static_cast<char>(tolower(buff[i])) << std::endl;