指针传染媒介,推挤元素的语法

时间:2016-11-06 04:45:08

标签: c++ pointers vector

vector<thread>* myVector;

我用来声明线程指针的向量。

thread* new_thread = new thread(chef_thread,&kill, new std::mutex, &foodQ,     
    numberChefs); //New Thread
myVector->push_back(*new_thread);

Chef_Thread是我在同一个.cpp文件中声明的函数。

我尝试编译代码,一切都变得很糟糕。 谢谢!

2 个答案:

答案 0 :(得分:2)

vector<thread>* myVector;声明指向vector thread的指针。

您正在寻找的类型是vector<thread*>,它会声明vector thread个指针。

答案 1 :(得分:1)

user2899162指出代码中的即时错误是正确的。但是我怀疑是否需要使用指针。

作为一般规则:您不应该在程序中使用原始 - 即手动输入 - newdelete。因为那是手动资源管理而你 会弄错。改为使用RAII,即依赖构造函数并在对象范围的末尾自动执行析构函数,以避免手动资源管理。 [1]

std::vector<std::thread> threads;
threads.push_back(std::thread(
        chef_thread,
        &kill,
        std::mutex(), // this is weird, see below
        &foodQ,     
        numberChefs));

threads超出范围时,所有线程和互斥对象以及向量本身都将自动销毁。

现在的奇怪之处:独立的互斥锁(代码中的new std::mutex参数)。这会创建一个仅为chef_thread函数所知的互斥对象。我们需要更多的代码来说明确定的内容,但我在这里闻到了一个错误。互斥锁是共享资源的同步机制。访问资源的每个人都必须通过相同的互斥锁执行此操作。但是,如果只有一个函数知道互斥锁,那怎么可能呢?我看到的唯一方法是从chef_thread内部传递一个指向互斥锁的引用或指针,这是一个红旗本身。

[1]当然,这条规则有例外。显而易见的是一个包装器/容器类,其构造函数中包含new,并且在其析构函数中具有相应的delete。简而言之,就是如何实现RAII,这就是所有std容器,智能指针和其他资源包装器的工作方式。