指针的向量,推入元素的语法

Vector of Pointers, syntax for pushing element

本文关键字:元素 语法 向量 指针      更新时间:2023-10-16
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文件中声明的一个函数。

我试着编译代码,结果一切都糟透了。谢谢!

vector<thread>* myVector;声明了一个指向thread s的vector的指针。

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

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容器,智能指针和其他资源包装器的工作方式。