【问题标题】:How to make threads with functions: C++如何使用函数创建线程:C++
【发布时间】:2019-09-11 07:30:33
【问题描述】:

我正在尝试通过函数使用 C++ 的标准库创建线程。

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

void print()
{
    printf("PRINT\n");
    printf("PRINT2\n");
}

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

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

程序编译并运行,但一旦线程完成,它会创建一个“调试错误”。有什么想法吗?

【问题讨论】:

  • 你不应该在线程子例程中使用printf
  • 什么样的“调试错误”?有消息吗?程序是否行为不端?
  • @stackptr - 说谁?

标签: c++ multithreading visual-c++


【解决方案1】:

问题是你的线程对象在你调用它的detach()join() 成员之前就超出了范围。

试试这个:

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 中。对 iostream 使用 std::cout

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 2013-03-28
      相关资源
      最近更新 更多