C ++中线程的简单示例

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

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

更新 - 我遗漏了任何操作系统特定的请求,希望谁回复谁都会回复跨平台库使用。 我只是现在就明确表达了。


创建一个你希望线程执行的函数。 我将用一个简单的例子来演示:

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

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

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

(你需要#include <thread>来访问std::thread类)

正如你所看到的,构造函数的参数是线程执行的函数,后面是函数的参数。

最后,将它加入到你的主执行线程中,如下所示:

t1.join(); 

(连接意味着调用新线程的线程将等待新线程完成执行,然后继续执行)。


代码

#include <string>
#include <iostream>
#include <thread>

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");

    // 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)特性。

  • 从技术上来说,任何这样的对象都会被构建在C风格的线程库上,因为C ++只是在c ++ 0x中指定了一个股票std::thread模型,该模型刚刚被钉住并且尚未实现。 这个问题有点系统性,从技术上说,现有的c ++内存模型不够严格,无法为所有'发生之前'的情况提供明确的语义。 Hans Boehm回过头来撰写了一篇关于这个主题的论文,并且帮助我们制定了关于该主题的c ++ 0x标准。

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

    这就是说有几个跨平台的线程C ++库在实践中工作得很好。 英特尔线程构建模块包含一个非常接近c ++ 0x标准的tbb :: thread对象,而Boost有一个boost ::线程库,可以执行相同的操作。

    http://www.threadingbuildingblocks.org/

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

    使用boost :: thread你会得到如下的东西:

    #include <boost/thread.hpp>
    
    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;
    }
    

    还有一个用于POSIX操作系统的POSIX库。 检查兼容性

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <iostream>
    
    void *task(void *argument){
          char* msg;
          msg = (char*)argument;
          std::cout<<msg<<std::endl;
    }
    
    int main(){
        pthread_t thread1, thread2;
        int i1,i2;
        i1 = pthread_create( &thread1, NULL, task, (void*) "thread 1");
        i2 = pthread_create( &thread2, NULL, task, (void*) "thread 2");
    
        pthread_join(thread1,NULL);
        pthread_join(thread2,NULL);
        return 0;
    
    }
    

    用-lpthread编译

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

    链接地址: http://www.djcxy.com/p/23311.html

    上一篇: Simple example of threading in C++

    下一篇: Good C++ GUI library for Windows