Передача строкового указателя на функцию, выполняющуюся в другом потоке в C ++ и Xcode 11.1 - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь запустить следующий простой пример.

void printString(const char* s)
{
    std::cout << s << std::endl;
}

int main()
{
      std::string str = "hello world";
      std::thread T3(printString, str.c_str());
}

Но я получаю следующую ошибку.

No matching constructor for initialization of 'std::thread'

Я использую Xcode 11.1.

Если бы это было скомпилировано, сработал бы этот код? Поскольку потоки совместно используют одну и ту же кучу, поток T3 должен иметь доступ к str.c_str(), верно? Предполагая, что в куче выделено std::string буферов.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Я решил эту проблему, настроив свой CMake на использование C ++ 11

set (CMAKE_CXX_STANDARD 11)

В сгенерированном проекте XCode теперь установлены правильные флаги компилятора, и опубликованный код компилируется правильно.

0 голосов
/ 07 ноября 2019

Для того чтобы использовать std :: thread, вам необходимо включить соответствующий заголовочный файл. Затем вы должны решить дождаться, пока поток выполнит свою работу или отсоединит его. В противном случае std :: thread вызовет std :: terminate в деструкторе. Другая проблема заключается в том, что в функции printString у вас будет висячий указатель, если main возвращает и освобождает строку.

Итак, одно из возможных решений

#include <thread>
#include <iostream>

void printString(const char* s)
{
    std::cout << s << std::endl;
}

int main()
{
      std::string str = "hello world";
      std::thread T3(printString, str.c_str());
      T3.join();
      return 0;
}
...