В соседнем треде промелькнула очень интересная мысль.
Отличие синьора-помидора на C++ от мидла в том, что последний уже знает что C++ говно, но еще не знает, почему.
Внимание, вопрос уровня синьора-помидора. Дан код. Объясните, почему другой синьор-помидор обосрался, написав его? Где может обосраться пользователь?
Задачу не будем усложнять, допустим, у нас single producer - single consumer предполагается.
#ifndef __BLOCKING_QUEUE_HPP__
#define __BLOCKING_QUEUE_HPP__
#include <cstdlib>
#include <mutex>
#include <condition_variable>
template<typename T>
class BlockingQueue
{
private:
struct QueueNode
{
T val;
QueueNode * next;
};
QueueNode *_first, *_last;
std::mutex _cs;
std::condition_variable _cv;
bool _abort;
int _count;
public:
BlockingQueue()
{
_first = _last = nullptr;
_abort = false;
_count = 0;
}
~BlockingQueue()
{
Flush();
}
BlockingQueue(const BlockingQueue& rhs) = delete;
void operator=(const BlockingQueue& rhs) = delete;
bool Put(const T& val)
{
std::unique_lock<std::mutex> lock(_cs);
if(!_abort)
{
QueueNode * node = (QueueNode*)malloc(sizeof(QueueNode));
if (node)
{
new (&node->val) T(val);
node->next = nullptr;
if (_last)
_last->next = node;
else
_first = node;
_last = node;
++_count;
_cv.notify_one();
return true;
}
}
return false;
}
bool Get(T& val)
{
std::unique_lock<std::mutex> lock(_cs);
for (;;)
{
if (_abort) return false;
QueueNode * node = _first;
if (node)
{
_first = node->next;
if (!_first) _last = nullptr;
--_count;
val = node->val;
node->val.~T();
free(node);
return true;
}
else
{
_cv.wait(lock);
}
}
}
int Count()
{
return _count;
}
void Flush()
{
QueueNode *node, *tmp;
std::unique_lock<std::mutex> lock(_cs);
for (node = _first; node; node = tmp)
{
tmp = node->next;
node->val.~T();
free(node);
}
_first = nullptr;
_last = nullptr;
_count = 0;
}
void Abort()
{
std::unique_lock<std::mutex> lock(_cs);
_abort = true;
_cv.notify_one();
}
void Start()
{
std::unique_lock<std::mutex> lock(_cs);
_abort = false;
_cv.notify_one();
}
};
#endif // __BLOCKING_QUEUE_HPP__
Вопрос номер два - назовите хотя бы один язык программирования с подобными проблемами.