Я хотел бы реализовать сценарий производитель/потребитель, подчиняющиеся интерфейсы, которые грубо:Как реализовать блокировки чтения с использованием POSIX Threads
class Consumer {
private:
vector<char> read(size_t n) {
// If the internal buffer has `n` elements, then dequeue them
// Otherwise wait for more data and try again
}
public:
void run() {
read(10);
read(4839);
// etc
}
void feed(const vector<char> &more) {
// Safely queue the data
// Notify `read` that there is now more data
}
};
В этом случае feed
и run
будет работать на отдельных потоках и read
должны (например, recv
и fread
). Очевидно, мне понадобится какое-то взаимное исключение для моего дека, и мне понадобится какая-то система уведомлений, чтобы сообщить read
, чтобы попробовать еще раз.
Я слышу Переменные состояния - это путь, но все мои многопотоковые ощущения лежат в Windows, и мне тяжело обворачивать вокруг себя голову.
Спасибо за помощь!
(Да, я знаю, что это неэффективно для возврата векторов. Давайте не будем вдаваться в это.)
Хорошо, но помните, что я хочу, чтобы мое чтение преуспело. Нет никакой гарантии, что `push_em_in` сбрасывает достаточное количество данных для этого. Таким образом, чтение нужно будет ждать, пока этого не будет достаточно. Это тот цикл, который я хочу убедиться, эффективен (не вращается). – 2008-10-15 23:19:09
Вы также можете использовать RAII, чтобы убедиться, что функция lock() unlock() является безопасной. – 2008-10-15 23:20:30
@Frank, еще раз взломал концепцию. Вы следите за тем, как лучше использовать мьютексы pthread? – 2008-10-15 23:24:41