我如何在线程之间进行通信

时间:2012-09-03 05:01:10

标签: c++ multithreading

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

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

4 个答案:

答案 0 :(得分: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已在线程之间共享。这是一种通信形式,您可以共享类结构字符串,任何您想要的。

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

答案 1 :(得分:1)

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

答案 2 :(得分: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;
      }

答案 3 :(得分:-2)

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

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

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