Cześć
uczę się wielowątkowości gdzie i jak tylko moge :)
Bogaty Kot w wątku
https://4programmers.net/Forum/1342548
dal poniższy przykład
template<typename T> class Queue
{
public:
T pop()
{
std::unique_lock<std::mutex> lk(m_mutex);
bool found = false;
T res;
do
{
m_cv.wait(lk);
if (!m_queue.empty())
{
found = true;
res = m_queue.front();
m_queue.pop_front();
m_cv.notify_one();
}
lk.unlock();
}
while (!found);
return res;
}
void push(const T& e)
{
std::unique_lock<std::mutex> lk(m_mutex);
m_queue.push_back(e);
m_cv.notify_one();
}
private:
std::deque<T> m_queue;
std::mutex m_mutex;
std::condition_variable m_cv;
};
z komentarzem
Implementacja totalnie zwalona (mozliwy deadlock, race condition + 1 UB).
Os dependent tez zwalil ale nie chce mi sie juz tego pisac.
Proszę o wyjasnienie czy dobrze rozumiem
- mozliwy deadlock,- nie wiem o co chodzi? DL kojarzył mi się z sytuacją
fun1()
{
lock_guard<mutex> g1(myMutex1);
lock_guard<mutex> g2(myMutex2);
}
fun2()
{
lock_guard<mutex> g1(myMutex2);
lock_guard<mutex> g2(myMutex1);
}
i jeden sobie czeka na drugiego, drugi na pierwszego itd
nie widzę w powyższym kodzie deadlocka - może tu chodzi że jest coś nie tak z condition_variable?
- race condition - chodzi o to, że
a) nie sprawdzamy empty specjalnie z mutexem (m_queue.empty()), chodzi mi o specjalną metodą dla ThreadSafe Queue
nie potrafię niczego innego wymyśleć
3)1 UB ? co to w góle znaczy :)
z góry dziękuję za odpowiedź