Я использую потоки в 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;
}
0
jprince14 16 Окт 2014 в 05:41
1
thread1 не существует за рамками вашего утверждения if, должно быть много дубликатов этого типа вопроса.
 – 
Shafik Yaghmour
16 Окт 2014 в 05:48
Проблема должна быть сразу очевидна из очень четкого сообщения об ошибке... но, возможно, вы не знаете, что такое область действия?
 – 
Jim Balter
16 Окт 2014 в 06:13

2 ответа

Лучший ответ

Тело оператора if() является областью действия блока, поэтому все переменные, созданные в ней, связаны с ее областью. Это означает, что thread1 недоступен вне оператора if().

Вместо этого вы можете по умолчанию построить поток, а затем назначить его новому:

std::thread thread1;

if (true) {
    thread1 = std::thread(testthread)
}
6
David G 16 Окт 2014 в 05:48

Вы объявляете переменную потока внутри блока if. Это видно только там. Если вам действительно нужно инициализировать его внутри блока if и использовать снаружи, вы можете использовать указатель и разместить его внутри блока if.

std::thread* pThread1 = nullptr;
if (true) {
        pThread1 = new std::thread(testthread);
}
sleep(1);
pThread1->join();
delete(pThread1);
1
fhsilva 16 Окт 2014 в 05:56