Я использую потоки в C ++ 11 и сталкиваюсь с проблемой компиляции всякий раз, когда инициирую поток из оператора if.
Я получаю следующую ошибку:
file.cpp: In function ‘int main(int, char**)’:
file.cpp:16:2: error: ‘thread1’ was not declared in this scope
thread1.join();
Когда я перемещаю поток за пределы оператора if, все компилируется и работает нормально.
Я использую g ++ версии 4.8.2 и параметр компилятора -std = c ++ 11.
Этот код не будет компилироваться
#include <unistd.h>
#include <thread>
#include <iostream>
void testthread() {
std::cout << "Thread was run" << std::endl;
}
int main(int argc, char**argv) {
if (true) {
std::thread thread1(testthread);
}
sleep(1);
thread1.join();
return 0;
}
Этот код компилируется и работает, как ожидалось
#include <unistd.h>
#include <thread>
#include <iostream>
void testthread() {
std::cout << "Thread was run" << std::endl;
}
int main(int argc, char**argv) {
std::thread thread1(testthread);
sleep(1);
thread1.join();
return 0;
}
2 ответа
Тело оператора if()
является областью действия блока, поэтому все переменные, созданные в ней, связаны с ее областью. Это означает, что thread1
недоступен вне оператора if()
.
Вместо этого вы можете по умолчанию построить поток, а затем назначить его новому:
std::thread thread1;
if (true) {
thread1 = std::thread(testthread)
}
Вы объявляете переменную потока внутри блока if. Это видно только там. Если вам действительно нужно инициализировать его внутри блока if и использовать снаружи, вы можете использовать указатель и разместить его внутри блока if.
std::thread* pThread1 = nullptr;
if (true) {
pThread1 = new std::thread(testthread);
}
sleep(1);
pThread1->join();
delete(pThread1);
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
thread1
не существует за рамками вашего утвержденияif
, должно быть много дубликатов этого типа вопроса.