Search
 
SCRIPT & CODE EXAMPLE
 

CPP

c++ synchronization primitives example programs

 
#include <queue>
#include <memory>
#include <mutex>
#include <condition_variable>
template<typename T>
class threadsafe_queue
{
private:
    mutable std::mutex mut;      ❶ 
    std::queue<T> data_queue;
    std::condition_variable data_cond;
public:
    threadsafe_queue()
    {}
    threadsafe_queue(threadsafe_queue const& other)
    {
        std::lock_guard<std::mutex> lk(other.mut);
        data_queue=other.data_queue;
    }
    void push(T new_value)
    {
        std::lock_guard<std::mutex> lk(mut);
        data_queue.push(new_value);
        data_cond.notify_one();
    }
    void wait_and_pop(T& value)
    {
        std::unique_lock<std::mutex> lk(mut);
        data_cond.wait(lk,[this]{return !data_queue.empty();});
        value=data_queue.front();
        data_queue.pop();
    }
    std::shared_ptr<T> wait_and_pop()
    {
        std::unique_lock<std::mutex> lk(mut);
        data_cond.wait(lk,[this]{return !data_queue.empty();});
        std::shared_ptr<T> res(std::make_shared<T>(data_queue.front()));
        data_queue.pop();
        return res;
    }
    bool try_pop(T& value)
    {
        std::lock_guard<std::mutex> lk(mut);
        if(data_queue.empty())
            return false;
        value=data_queue.front();
        data_queue.pop();
        return true;
    }
    std::shared_ptr<T> try_pop()
    {
        std::lock_guard<std::mutex> lk(mut);
        if(data_queue.empty())
            return std::shared_ptr<T>();
        std::shared_ptr<T> res(std::make_shared<T>(data_queue.front()));
        data_queue.pop();
        return res;
    }
    bool empty() const
    {
        std::lock_guard<std::mutex> lk(mut);
        return data_queue.empty();
    }
};
 
Comment

PREVIOUS NEXT
Code Example
Cpp :: c pointer syntax 
Cpp :: appdivind c++ stuctures 
Cpp :: c++ void to avoid functions 
Cpp :: https://www.google 
Cpp :: sort n characters in descending order c++ 
Cpp :: niet full form 
Cpp :: initialize multiple variables to 0 c++ 
Cpp :: C++ if...else Statement 
Cpp :: compile c++ program 
Cpp :: cpp console progressbar 
Cpp :: graph colouring backtracking 
Cpp :: windows install cppcheck 
Cpp :: 2160. Minimum Sum of Four Digit Number After Splitting Digits leetcode solution in c++ 
Cpp :: how to find the mean and standard deviation of trqiing dataset in pytorch 
Cpp :: is there interfaces in c++ like 
Cpp :: simple interest rate 
Cpp :: C++ initializing a thread with a class/object with parameters 
Cpp :: how to calculate the sum of primary diagonal matrix and secondary diagonal matrix using c++ 
Cpp :: sieve of eratosthenes c++ 
Cpp :: pointers in c++ 
Cpp :: c++ set element at index 
Cpp :: cpp tutorial 
Cpp :: bus ticket booking online pakistan 
Cpp :: c++ forloop 
C :: remix icon cdn 
C :: how to download file in powershell 
C :: Which of the following are Cetaceans? 
C :: dvlprroshan 
C :: C program to display fibonacci serice 
C :: c for schleife 
ADD CONTENT
Topic
Content
Source link
Name
5+6 =