小编Bee*_*zum的帖子

c ++:can vector <Base>包含Derived类型的对象吗?

标题基本概括了所有内容.基本上,这样做是合法的:

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++ polymorphism vector object-slicing

7
推荐指数
1
解决办法
4059
查看次数

将Mutex保护构建到C++类的线程安全方法?

我正在尝试用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)

c++ multithreading mutex

3
推荐指数
1
解决办法
9339
查看次数