当前位置:  开发笔记 > 编程语言 > 正文

C++中线程的简单示例

如何解决《C++中线程的简单示例》经验,为你挑选了7个好方法。

有人可以发布一个在C++中启动两个(面向对象)线程的简单示例.

我正在寻找实际的C++线程对象,我可以扩展运行方法(或类似的东西),而不是调用C风格的线程库.

更新 - 我遗漏了任何特定于操作系统的请求,希望无论谁回复都会回复使用跨平台库.我现在只是明白了.



1> MasterMastic..:

创建一个您希望线程执行的函数,例如:

void task1(std::string msg)
{
    std::cout << "task1 says: " << msg;
}

现在创建thread最终将调用上述函数的对象,如下所示:

std::thread t1(task1, "Hello");

(你需要#include 访问该std::thread课程)

构造函数的参数是线程将执行的函数,后跟函数的参数.线程在构造时自动启动.

如果稍后您要等待线程执行该函数,请调用:

t1.join(); 

(加入意味着调用新线程的线程将等待新线程完成执行,然后才会继续自己的执行).


代码

#include 
#include 
#include 

using namespace std;

// The function we want to execute on the new thread.
void task1(string msg)
{
    cout << "task1 says: " << msg;
}

int main()
{
    // Constructs the new thread and runs it. Does not block execution.
    thread t1(task1, "Hello");

    // Do other things...

    // Makes the main thread wait for the new thread to finish execution, therefore blocks its own execution.
    t1.join();
}

有关std :: thread的更多信息,请访问此处

在GCC上,编译-std=c++0x -pthread.

这适用于任何操作系统,授予您的编译器支持此(C++ 11)功能.


@ Preza8 VS10不支持C++ 11中的许​​多功能.VS12和VS13支持线程.
在评论"4.7以下的GCC版本中,使用`-std = c ++ 0x`(而不是`-std = c ++ 0x`)"我相信第二个"c ++ 0x"应该是"c ++" 11",但由于编辑太小,因此无法更改.
@ user2452253如果传递"task1",则传递指向要执行的函数的指针(这很好).如果你传递"&task1",你会传递一个指向函数指针的指针,结果可能不那么漂亮且非常未定义(这就像尝试一个接一个地执行随机指令.正确的概率你*只是可能*打开地狱之门).你真的只想传递函数指针(一个带有函数开始地址值的指针).如果这不清楚,请告诉我,祝你好运!

2> Edward KMETT..:

好吧,从技术上讲,任何这样的对象最终都会在C风格的线程库上构建,因为C++只是std::thread在c ++ 0x中指定了一个库存模型,它刚刚被确定并且尚未实现.问题在某种程度上是系统性的,从技术上讲,现有的c ++内存模型不够严格,无法为所有"之前发生的"案例提供明确定义的语义.Hans Boehm不久前写了一篇关于这个主题的论文,并且有助于敲定关于该主题的c ++ 0x标准.

http://www.hpl.hp.com/techreports/2004/HPL-2004-209.html

这就是说有几个跨平台的线程C++库在实践中运行得很好.英特尔线程构建块包含一个非常接近c ++ 0x标准的tbb :: thread对象,而Boost有一个boost :: thread库,它也是如此.

http://www.threadingbuildingblocks.org/

http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html

使用boost :: thread你会得到类似的东西:

#include 

void task1() { 
    // do stuff
}

void task2() { 
    // do stuff
}

int main (int argc, char ** argv) {
    using namespace boost; 
    thread thread_1 = thread(task1);
    thread thread_2 = thread(task2);

    // do other stuff
    thread_2.join();
    thread_1.join();
    return 0;
}


提升线程很棒 - 我唯一的问题是你不能(当我上次使用它时)实际访问本机底层线程句柄,因为它是一个私有类成员!在win32中有一些东西你需要使用threadhandle,所以我们调整它以使句柄公开.
boost :: thread的另一个问题是,我记得你没有自由设置新线程的堆栈大小 - 这个功能也令人遗憾地不包含在c ++ 0x标准中.

3> Hohenheimsen..:

POSIX操作系统还有一个POSIX库. 检查兼容性

#include 
#include 
#include 
#include 

void *task(void *argument){
      char* msg;
      msg = (char*)argument;
      std::cout<

用-lpthread编译

http://en.wikipedia.org/wiki/POSIX_Threads



4> Caner..:

这是一种创建任意数量线程的更强大的方法(在C++ 11或更新版本中):

#include 
#include 
#include 
using namespace std;

void doSomething(int id) {
    cout << id << "\n";
}

/**
 * Spawns n threads
 */
void spawnThreads(int n)
{
    std::vector threads(n);
    // spawn n threads:
    for (int i = 0; i < n; i++) {
        threads[i] = thread(doSomething, i + 1);
    }

    for (auto& th : threads) {
        th.join();
    }
}

int main()
{
    spawnThreads(10);
}



5> livingtech..:

当搜索在新线程中调用其自己的实例方法之一的C++类的示例时,会出现此问题,但我们无法以这种方式使用任何这些答案.这是一个例子:

Class.h

class DataManager
{
public:
    bool hasData;
    void getData();
    bool dataAvailable();
};

Class.cpp

#include "DataManager.h"

void DataManager::getData()
{
    // perform background data munging
    hasData = true;
    // be sure to notify on the main thread
}

bool DataManager::dataAvailable()
{
    if (hasData)
    {
        return true;
    }
    else
    {
        std::thread t(&DataManager::getData, this);
        t.detach(); // as opposed to .join, which runs on the current thread
    }
}

请注意,此示例不会进入互斥锁或锁定.



6> Daksh..:

除非想要在全局namespac中使用单独的函数,否则我们可以使用lambda函数来创建线程.

使用lambda创建线程的一个主要优点是我们不需要将本地参数作为参数列表传递.我们可以使用相同的捕获列表,lambda的closure属性将处理生命周期.

这是一个示例代码

int main() {
    int localVariable = 100;

    thread th { [=](){
        cout<<"The Value of local variable => "<

到目前为止,我发现C++ lambdas是创建线程的最佳方式,尤其是对于更简单的线程函数



7> LorenzCK..:

它在很大程度上取决于您决定使用的库.例如,如果您使用wxWidgets库,则线程的创建将如下所示:

class RThread : public wxThread {

public:
    RThread()
        : wxThread(wxTHREAD_JOINABLE){
    }
private:
    RThread(const RThread ©);

public:
    void *Entry(void){
        //Do...

        return 0;
    }

};

wxThread *CreateThread() {
    //Create thread
    wxThread *_hThread = new RThread();

    //Start thread
    _hThread->Create();
    _hThread->Run();

    return _hThread;
}

如果您的主线程调用CreateThread方法,您将创建一个新线程,该线程将开始执行"Entry"方法中的代码.在大多数情况下,您必须保持对线程的引用才能加入或停止它.更多信息:wxThread文档

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有