У меня возникла тупиковая ситуация, которую я не могу объяснить с помощью приведенного ниже кода. Я ожидал, что код должен работать из-за ложного пробуждения, но мне кажется, что я что-то упускаю. Я проверил взаимоблокировку этой переменной Condition, но безуспешно.
class SafeQueue
{
private:
std::queue data_queue;
mutable std::mutex m;
std::condition_variable cv;
std::atomic flag{ true }; // Atomic flag to control the queue
public:
void push(int val)
{
std::lock_guard lock(m);
data_queue.push(val);
cv.notify_one(); // Notify waiting thread upon pushing data
}
bool pop(int& val)
{
std::unique_lock lock(m);
cv.wait(lock, [this]() { return !data_queue.empty() || !flag; }); // Wait until queue is not empty or flag is turned off
if (!flag && data_queue.empty())
{
return false; // Queue is empty and flag is off, return false to indicate termination
}
if (!data_queue.empty())
{
val = data_queue.front();
data_queue.pop();
return true;
}
return false;
}
void turnOff()
{
flag = false;
}
bool isFlagOn() const
{
return flag;
}
};
void consumerLoop(SafeQueue& q)
{
while (q.isFlagOn())
{
int val;
if (q.pop(val))
{
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/78296766/deadlock-on-condition-variable-example[/url]
У меня возникла тупиковая ситуация, которую я не могу объяснить с помощью приведенного ниже кода. Я ожидал, что код должен работать из-за [b]ложного пробуждения[/b], но мне кажется, что я что-то упускаю. Я проверил взаимоблокировку этой переменной Condition, но безуспешно. [code]class SafeQueue { private: std::queue data_queue; mutable std::mutex m; std::condition_variable cv; std::atomic flag{ true }; // Atomic flag to control the queue
public: void push(int val) { std::lock_guard lock(m); data_queue.push(val); cv.notify_one(); // Notify waiting thread upon pushing data }
bool pop(int& val) { std::unique_lock lock(m); cv.wait(lock, [this]() { return !data_queue.empty() || !flag; }); // Wait until queue is not empty or flag is turned off
if (!flag && data_queue.empty()) { return false; // Queue is empty and flag is off, return false to indicate termination }
if (!data_queue.empty()) { val = data_queue.front(); data_queue.pop(); return true; } return false; }
void turnOff() { flag = false; }
bool isFlagOn() const { return flag; } };
void consumerLoop(SafeQueue& q) { while (q.isFlagOn()) { int val; if (q.pop(val)) { std::cout
Рассмотрим следующий случай (это стандартное использование в cppreferences):
std::atomic условие (false); тема 1: замок // проверяем условие в последний раз перед ожиданием если (условие == true) {unlock; возвращаться; } // чтобы внести ясность, я...
Система: Linux
Язык: C
Описание:
У меня есть программа, похожая на базу данных, но для меня. Он прост, использует файлы и адаптирован к моим потребностям. Он написан на C. Выполняется 6 потоков: один управляющий поток и 5 рабочих потоков....