在尝试从 Git 存储库编译项目的代码库时,我遇到了以下错误:
DGSF-AvA/worker/serverless_gpu/svgpu_manager.cpp:90:78: error: use of deleted function ‘std::atomic<unsigned int>::atomic(const std::atomic<unsigned int>&)’
printf("not my turn: me %u turn %u\n", current_id, current_turn);
^
我搜索了问题背后的原因并发现了一个问题。
根据上面的问题和所述的解决方案,我假设错误是由下面给出的行引起的(在文件中):
...
...
std::atomic<uint32_t> current_turn(0); //<------Suspected line causing the issue
uint32_t current_id(0);
std::mutex sched_lock;
ava_proto::WorkerAssignReply SVGPUManager::HandleRequest(const ava_proto::WorkerAssignRequest &request) {
ava_proto::WorkerAssignReply reply;
if (request.gpu_count() > 1) {
std::cerr << "ERR: someone requested more than 1 GPU, no bueno" << std::endl;
return reply;
}
sched_lock.lock();
uint32_t q_id = current_id;
current_id += 1;
sched_lock.unlock();
uint32_t gpu_mem = request.gpu_mem()[0];
//std::cerr << "[SVLESS-MNGR]: API server request arrived, asking for schedule with memory " << gpu_mem << std::endl;
while (true) {
//if not our turn, wait
if (current_turn != current_id) {
printf("not my turn: me %u turn %u\n", current_id, current_turn); // <--- line which complains of the deleted function
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
...
...
我认为原因与链接的问题线程中提到的类似。但是,建议将此处初始化
current_turn
的方式作为链接问题的答案中的有效解决方案。
我什至尝试了解决方案中列出的其他几个选项:
std::atomic<uint32_t> current_turn{0};
std::atomic<uint32_t> current_turn = {0};
但是上述替代方案都不能解决这个问题。我发现
current_turn
的数据类型是std::atomic<uint32_t>
(与问题中提到的数据类型std::atomic_int
不同)
另外,我正在谈论的项目使用了
CMake
。编译器标准声明如下:
set(CMAKE_CXX_STANDARD 14)
因此,该项目是使用
C++14
而不是 C++11
(在链接的问题中)构建的。谁能帮我解决这个问题吗?
std::atomic
不是原始类型,不能在 printf
中使用,并且无法复制。您可能想在 current_turn.load()
中使用 printf
。