5

如何在 C++ 中创建线程并在主线程和另一个线程之间进行通信?

一些代码示例将不胜感激。

4

4 回答 4

2

线程与其作用域共享变量,这就是互斥锁如此重要的原因。

因此,只需编辑两个线程共有的变量,您就可以轻松地进行通信:

#include <iostream>
#include <pthread.h> 
main()  {
    pthread_t f2_thread, f1_thread; 
    void *f2(), *f1();
    int i1;
    i1 = 1;
    pthread_create(&f1_thread,NULL,f1,&i1);
    pthread_create(&f2_thread,NULL,f2,&i1);
    pthread_join(f1_thread,NULL);
    pthread_join(f2_thread,NULL);
}
void *f1(int *x){
  std::cout << *x << std::endl;
}
void *f2(int *x){
  sleep(1)
  std::cout << ++(*x) << std::endl;
}

这应该打印出来:

1
2

并且变量 i1 已在线程之间共享。这是一种通信形式,您可以共享类结构字符串,任何您想要的。

注意:此代码几乎肯定会导致线程竞争。这只是一个示例,在线程之间共享内存时,您应该始终使用同步和线程安全的做法。

于 2012-09-03T05:18:04.310 回答
1

在线程创建中,答案是显而易见的(我认为是),无论std::thread你有 C++11 还是boost::thread其他,但如果消息传递它取决于你的问题和你的编程风格。
作为通用解决方案,我更喜欢boost::asio::io_service它的使用非常灵活,您可以发布任何类型的函数或函数对象以在其他线程的上下文中执行,使用这种技术您不需要任何互斥锁等,您也可以提供给消费者和生产者的组线程以及许多其他有用的功能。

于 2012-09-03T07:24:19.007 回答
0

好的,我会告诉你我知道的最简单的:_beginthread

  • 你必须包括process.h这个才能工作。
  • 必须有一个要线程化的函数。
  • 函数参数入口必须是 (void *)。
  • 函数应该有一个_endthread() 何时需要结束。

在下面的程序中,两个线程竞争寻找 pi 值。如果其中一个找到值 pi,它会通知另一个线程它应该结束。同样在 main() 中,它会打印出哪个找到了 pi。第三个线程只是等待其他线程之一完成。

      #include<process.h>
      #include<windows.h> //for the Sleep()
      #include<stdio.h>
      volatile boolean found=false;
      volatile int who=0;

      void find_pi_core1(void * iterations)
      {

          int * ite=(int *)iterations;
          for(int i=0;i<ite;i++)
          {
              //a sample of Monte-Carlo method here to find pi 
              //gets pi with more precision with additional iterations
               if(found) _endthread();
          }
          found=true;who=1;
          _endthread();    

       }

       void find_pi_core2(void * iterations)
       {

           int * ite=(int *)iterations;
           for(int i=0;i<ite;i++)
           {
                //a sample of Monte-Carlo method here to find pi 
                //gets pi with more precision with additional iterations
                 if(found) _endthread();
           }
           found=true;who=2;
          _endthread();
      }

       void printscreeN(void * dummy)
       {

          while(!found)
          {
              Sleep(30);      //if dont sleep, it gets a lot of cpu power
          }
          printf(" found! \n" );
          _endthread();
      }

      int main()
      {

                      Function name
                          ^       Stack size
                          |          ^           Function parameter
                          |          |             ^
          _beginthread(find_pi_core1,0,(void *) 3000000);
          _beginthread(find_pi_core2,0,(void *) 2500000);
          _beginthread(printscreeN,0,(void *)0);
          Sleep(3000);
          if(found)
          { 
               printf("pi has been found! core-%d has found pi first ",who);
          }
          else
          {printf("pi has not been bound!");}
          return 0;
      }
于 2012-09-03T05:41:57.177 回答
-2

线程创建取决于操作系统。

在 Linux 上,您可以使用 pthread 库函数 pthread_create 创建线程,并使用 pthread_join 等待线程完成。

在 Windows 上,您可以使用 CreateThread() Windows API 函数创建线程,并使用 WaitForSingleObject() 函数等待线程完成。

于 2012-09-03T05:21:55.837 回答