21xrx.com
2024-06-03 04:43:20 Monday
登录
文章检索 我的文章 写文章
C++ 如何创建线程并传输数据
2023-07-02 11:42:42 深夜i     --     --
线程 创建 C++ 传输数据

在C++中创建线程并在线程之间传输数据是一项重要的任务。这个过程并不像在单线程中执行代码那么简单,因为线程之间的数据传输需要更多的注意和协调。

在C++中,我们可以使用标准库中的线程类来创建线程。为了传输数据,在主线程和其他线程之间我们可以使用共享变量或者消息队列这样的机制。

使用共享变量传输数据

在主线程和其他线程之间传输数据时,最常用的方法是使用共享变量。这个变量可以在线程之间共享,并且我们可以使用锁来确保数据的安全性。下面是一个简单的例子:


#include <iostream>

#include <thread>

#include <mutex>

using namespace std;

int g_count = 1000;

mutex g_mutex;

void WorkerThread()

{

  while(g_count > 0)

  {

    g_mutex.lock();

    if(g_count > 0)

    

      g_count--;

      cout << "Worker Thread: " << g_count << endl;

    

    g_mutex.unlock();

  }

}

int main()

{

  thread t(WorkerThread);

  while(g_count > 0)

  {

    g_mutex.lock();

    if(g_count > 0)

    

      g_count--;

      cout << "Main Thread: " << g_count << endl;

    

    g_mutex.unlock();

  }

  t.join();

  return 0;

}

以上代码创建了一个全局变量g_count,并且在主线程中减少变量的值。在工作线程中也是同样的操作。由于这个变量是全局的,所以线程可以共享这个变量并且更改它的值。然而,为了避免出现数据竞争,代码使用了互斥锁来确保每个线程都可以安全地访问g_count变量。

使用消息队列传输数据

另一种传输数据的机制是使用消息队列。消息队列可以确保数据的完整性和可靠性,并且允许线程之间异步地传输数据。使用消息队列需要一些额外的代码,因为我们需要创建一个数据结构来包装数据并将其添加到队列中。下面是一个使用消息队列传输数据的简单例子:


#include <iostream>

#include <thread>

#include <queue>

#include <mutex>

#include <condition_variable>

using namespace std;

struct Message

  int id;

  string text;

;

queue<Message> g_messageQueue;

mutex g_mutex;

condition_variable g_cond;

void WorkerThread()

{

  while(true)

  {

    unique_lock<mutex> lock(g_mutex);

    g_cond.wait(lock, []{ return !g_messageQueue.empty();});

    Message message = g_messageQueue.front();

    cout << "Worker Thread: " << message.text << endl;

    g_messageQueue.pop();

    if(message.id == 0)

    

      return;

    

  }

}

int main()

{

  thread t(WorkerThread);

  for(int i = 0; i < 10; i++)

  {

    Message message;

    message.id = i;

    message.text = "Hello World " + to_string(i);

    unique_lock<mutex> lock(g_mutex);

    g_messageQueue.push(message);

    g_cond.notify_one();

  }

  Message message;

  message.id = 0;

  message.text = "Exit";

  unique_lock<mutex> lock(g_mutex);

  g_messageQueue.push(message);

  g_cond.notify_one();

  t.join();

  return 0;

}

以上代码创建了一个消息队列,这个队列可以在主线程和工作线程之间传输Message结构体的数据。为了实现安全的异步传输机制,代码使用了互斥锁和条件变量。

在主线程中,我们创建了10个Message对象并将它们添加到队列中。在这个过程中,我们还使用了条件变量g_cond.notify_one()来通知工作线程这个队列发生了改变。在工作线程中,它使用了条件变量g_cond.wait()来等待队列非空,并且等待主线程通知工作线程这个队列发生了改变。

总之,在C++中创建线程并传输数据可以使用共享变量或者消息队列来实现。共享变量是一个简单的方法,但是需要自己编写额外的代码以确保数据安全和完整性。消息队列可以更好地解决这个问题,并且提供了更灵活的数据传输机制。无论是哪种方法,在C++中创建线程和传输数据都需要谨慎地使用,以确保程序的正确运行。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复