标题基本概括了所有内容.基本上,这样做是合法的:
class Base {
//stuff
}
class Derived: public Base {
//more stuff
}
vector<Base> foo;
Derived bar;
foo.push_back(bar);
Run Code Online (Sandbox Code Playgroud)
基于我见过的其他帖子,以下是可以的,但我不想在这种情况下使用指针,因为它更难以使其线程安全.
vector<Base*> foo;
Derived* bar = new Derived;
foo.push_back(bar);
Run Code Online (Sandbox Code Playgroud) 我正在尝试用C++实现一个生产者/消费者模型多线程程序,用于我正在研究的项目.基本思想是主线程创建第二个线程来监视新数据的串行端口,处理数据并将结果放入由主线程周期性轮询的缓冲区中.我以前从未编写过多线程程序.我一直在阅读很多教程,但是他们都在C中.我想我已经掌握了基本概念,但我正在尝试c ++ ify it.对于缓冲区,我想创建一个内置互斥保护的数据类.这就是我想到的.
1)我是否以错误的方式解决这个问题?有没有更智能的方法来实现受保护的数据类?
2)如果两个线程试图同时调用ProtectedBuffer::add_back(),下面的代码会发生什么?
#include <deque>
#include "pthread.h"
template <class T>
class ProtectedBuffer {
std::deque<T> buffer;
pthread_mutex_t mutex;
public:
void add_back(T data) {
pthread_mutex_lock(&mutex);
buffer.push_back(data);
pthread_mutex_unlock(&mutex);
}
void get_front(T &data) {
pthread_mutex_lock(&mutex);
data = buffer.front();
buffer.pop_front();
pthread_mutex_unlock(&mutex);
}
};
Run Code Online (Sandbox Code Playgroud)
编辑:感谢所有伟大的建议.我试过在下面实现它们.我还添加了一些错误检查,所以如果一个线程以某种方式设法尝试锁定相同的互斥锁两次,它将优雅地失败.我认为.
#include "pthread.h"
#include <deque>
class Lock {
pthread_mutex_t &m;
bool locked;
int error;
public:
explicit Lock(pthread_mutex_t & _m) : m(_m) {
error = pthread_mutex_lock(&m);
if (error == 0) {
locked = true;
} else {
locked …Run Code Online (Sandbox Code Playgroud)