Как создавать потоки с функциями: C

#c #multithreading #visual-c

#c #многопоточность #visual-c

Вопрос:

Я пытаюсь создавать потоки, используя стандартную библиотеку C , с помощью функций.

 #include <iostream>
#include <thread>
using namespace std;

void print()
{
    printf("PRINTn");
    printf("PRINT2n");
}

void createThread() 
{
    thread newThread(print);
}

int main()
{
    createThread();
    cin.get();
}

  

программа компилируется и запускается, но как только поток завершен, она создает «ошибку отладки». Есть мысли?

Комментарии:

1. Вы не должны использовать printf в подпрограмме потока

2. Что за «ошибка отладки»? Есть ли сообщение? Неправильно ли работает программа?

3. @stackptr — кто говорит?

Ответ №1:

Проблема в том, что ваш объект thread выходит за пределы области видимости до того, как вы вызовете его detach() join() элемент or .

Попробуйте это:

 int main()
{
    thread newThread(print);
    ...
    newThread.join();
    return 0;
}
  

Ответ №2:

Если ваша «ошибка отладки» означает сообщение об ошибке компилятора, вам следует проверить, установлен ли -pthread флаг. То есть скомпилировать код с

 $ g   -std=c  11 main.cpp -pthread -o main
  

Если ваша «ошибка отладки» означает ошибку времени выполнения, вы должны помнить об join() этом после создания потока.

исходный код:

 #include <iostream>
#include <thread>

void print()
{
    std::cout << "PRINT"   << std::endl;;
    std::cout << "PRINT 2" << std::endl;;
}

void create_thread()
{
    std::thread print_thread(print);
    print_thread.join();  // remember to join()
}

int main()
{
    create_thread();
    return 0;
}
  

Кроме того, вы можете обратить внимание на 4 дополнительных пункта:

  1. using namespace std не рекомендуется.

  2. не забудьте join() после создания потока

  3. return 0 для main()

  4. printf() находится в stdio.h. используется std::cout для iostream