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文件中声明的函数。
我尝试编译代码,一切都变得很糟糕。 谢谢!
答案 0 :(得分:2)
vector<thread>* myVector;
声明指向vector
thread
的指针。
您正在寻找的类型是vector<thread*>
,它会声明vector
thread
个指针。
答案 1 :(得分:1)
user2899162指出代码中的即时错误是正确的。但是我怀疑是否需要使用指针。
作为一般规则:您不应该在程序中使用原始 - 即手动输入 - new
和delete
。因为那是手动资源管理而你 会弄错。改为使用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
容器,智能指针和其他资源包装器的工作方式。