c++线程间通信

c++线程间通过PostThreadMessage和GetMessage函数进行通信,下面用代码演示两个线程间的通信:

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include<windows.h>
using namespace std;

DWORD WINAPI ThreadFun1(LPVOID param);
DWORD WINAPI ThreadFun2(LPVOID param);

#define MY_MSG WM_USER+1 //定义用户消息

int main()
{

 DWORD threadID1;
 HANDLE hThread1 = CreateThread(NULL,0, ThreadFun1,NULL,0, &threadID1);
 HANDLE hThread2=  CreateThread(NULL,0, ThreadFun2,(PVOID)threadID1,0, NULL);
 HANDLE hThread[] = { hThread1 ,hThread2 };
 WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
 
 return 0;

}
DWORD WINAPI ThreadFun1(LPVOID param)
{

 MSG msg;
 while (GetMessage(&msg, NULL, 0, 0))
 {

     switch (msg.message)
     {

     case MY_MSG:
         printf(“收到消息%d\n”, msg.wParam);
         break;
     }
 }
 printf(“收到WM_QUIT\n”);
 return 0;

}
DWORD WINAPI ThreadFun2(LPVOID param)
{

 DWORD threadId = (DWORD)param;
 int N = 1;
 while (true)
 {

     if (N <= 10) {

         PostThreadMessage(threadId, MY_MSG, (WPARAM)N++, NULL); 
     }
     else {

         PostThreadMessage(threadId, WM_QUIT, NULL, NULL);
         break;
     }
         
     Sleep(1000);
 }
 return 0;

}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++线程间通信可以使用互斥锁(mutex)、条件变量(condition variable)等机制来实现。下面是一个简单的例子: ```c++ #include <iostream> #include <thread> #include <mutex> #include <condition_variable> std::mutex mtx; std::condition_variable cv; bool ready = false; void funcA() { // 这里做一些耗时的操作 std::this_thread::sleep_for(std::chrono::seconds(1)); // 加锁 std::unique_lock<std::mutex> lck(mtx); // 设置 ready 标志位为 true ready = true; // 通知等待的线程 cv.notify_all(); } void funcB() { // 加锁 std::unique_lock<std::mutex> lck(mtx); // 等待 ready 标志位为 true cv.wait(lck, []{ return ready; }); // ready 标志位为 true 时执行下面的代码 std::cout << "Hello, world!" << std::endl; } int main() { // 创建两个线程 std::thread t1(funcA); std::thread t2(funcB); // 等待两个线程结束 t1.join(); t2.join(); return 0; } ``` 其中,`funcA` 线程会在执行完一些耗时的操作后设置 `ready` 标志位为 true,并通知等待的线程。`funcB` 线程会等待 `ready` 标志位为 true 后输出一条消息。 在这个例子中,我们使用了一个互斥锁和一个条件变量来实现线程间通信。`std::unique_lock` 是一个 RAII 封装的互斥锁,它可以自动释放锁。`std::condition_variable` 是一个条件变量,它可以在等待时自动释放锁,并在通知时重新获取锁。在等待时,`cv.wait(lck, predicate)` 会释放锁并等待条件变量被通知。`predicate` 是一个可调用对象,用于判断条件是否满足。在通知时,`cv.notify_all()` 会通知所有等待的线程,并重新获取锁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值