如何在C ++中创建线程并在主线程和另一个线程之间进行通信?
一些代码示例将不胜感激。
答案 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
才能使其发挥作用。_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()函数等待线程完成。