مثالی از thread - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

مثالی از thread

0 امتیاز

سلام.یک مثال از thread  همراه با کدش گذاشتم.سوال اینه که برنامه ای بنویسید که طبق این دیاگرام توابع اجرا بشوند.توابعی که دریک راستا هستند باید همزمان اجرا شوند.توابع A,B,f  ورودی ندارند و ورودی های تابع c  و  dبه این ترتیب است.اگه امکان داره کد این سوال رو توضیح بدید.ممنون

c (1) ,c(2),…,c(n/2)    c(n/2+1),…,c(2n/3)   c(2n/3+1),…,c(n)           d (1),d(2),d(3                                                                         

 

 

#include<thread>
#include <iostream>
using namespace std;
void A()
{
}
void B()
{
}
void f()
{
}
void c(int i)
{
}
void D(int i)
{
}
void controlD(thread **t,int di,int n)
{
	int i;
	for(i=di*n/3;i<(di+1)+n/3;i++)
		t[i]->join();
	 D(i+1);
}
int _tmain(int argc, _TCHAR* argv[])
{
	int n=10;
	thread** T=new thread*[n];//chera T ro 2d dar nazar gereftim?
	A();
	B();
	for(int i=0;i<n;i++)
		T[i]=new thread(c,i+1);
	thread d1(controlD,T,0,n);//function controlD che kar miknoe?
	thread d2(controlD,T,1,n);
	thread d3(controlD,T,2,n);
	d1.join();//age gharare d1,d2,d3 hamzan ejra beshan ba join kardan ke dg ejraye hamzan mani nadare?kolan mafhom join daghian chie?
	d2.join();
	d3.join();
	f();
	for(int i=0;i<n;i++)
      delete T[i];
	  delete []T;
	return 0;
}

                                                                                    thread, c++, c++11, stdthread, پردازش موازی                   

 

 

سوال شده خرداد 21, 1393  بوسیله ی maryam (امتیاز 338)   12 33 44
ویرایش شده دی 30, 1393 بوسیله ی haniye sarbazi

1 پاسخ

+2 امتیاز
 
بهترین پاسخ

با توجه به کد و شکل  اول باید A اجرا بشه بعد B

بعد n تا thread بصورت همزمان اجرا بشن (برای همین یک آرایه n عضوی ساختیم و بعد از احرای A , B  شی شون رو ساختیم  )

حتما باید C1 و C2 , C3 قبل از D1 اجرا بشن پس از join داخل Control ID  استفاده می کنیم که مطمین باشیم که thread هایی که می خوایم قبل از انجام D اجرا شدن (کار join اینه که thread فعلی  که این جا   thread اصلی برنامه هم هست رو تا زمانی که thread مورد نظر  کامل اجرا نشده متوقف می کنه پس join ربطی به اجرای همزمان بقیه thread ها نداره )

3 خط d1 , d2 ,d3 هم که join زدین به همین دلیله چون حتما باید قبل از f هر 3 تا D انجام بشن پس از join استفاده می کنیم که وقتی که به f رسیدیم هر 3 تا اجرا شده باشن .

 

*ضمنا بهتره که از pointer استفاده نکنی از unique_ptr یا vector استفاده کن .

داخل کد شما به جای thread** میشه به این شکل نوشتش :

std::array<std::thread,n> T ;

مثلا  :

#include <thread>
#include <memory>
#include <array>
void A(){}
void B(){}
void f(){}
void c(int i){}
void D(){}

using ThreadContainer = std::array< std::thread, 10>;
void controlD(ThreadContainer& t, int di)
{
	int n = t.size();
	int i;
	for (i = di*n / 3; i < ((di + 1) * n) / 3; i++)//for ghabli yekam eshtebah bood
		t[i].join();
	D();
}
int main()
{
	A();
	B();
	ThreadContainer T;
	for (auto& t : T)
		t =std::thread(f);
	std::thread d1(controlD, std::ref(T), 0);
	std::thread d2(controlD, std::ref(T), 1);
	std::thread d3(controlD, std::ref(T), 2);
	d1.join();
	d2.join();
	d3.join();
	f();
	//no need for delete any thing
	return 0;
}

 

پاسخ داده شده خرداد 21, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد خرداد 21, 1393 بوسیله ی maryam
طبق نمودارd1,d2,d3 باید همزمان اجرا بشند.ولی داخل کد ما سه نخ اجرایی جدا برای اجرای این توابع داریم .پس همزمانی شون چطوریه؟وقتی ما یه thread ایجاد میکنیم تابع داخل اون همزمان با چی اجرا میشه؟همیشه همزمانیش با خط اصلی برنامه یعنی همون مینه؟
"طبق نمودارd1,d2,d3 باید همزمان اجرا بشند.ولی داخل کد ما سه نخ اجرایی جدا برای اجرای این توابع داریم .پس همزمانی شون چطوریه؟"
هر برنامه یک thread اصلی داره main thread بعد شما وقتی thread میسازین مثل این میمونه که یک برنامه کوچیک دیگه رو از داخل این برنامه بصورت مجزا دارین اجرا می کنین .
به محض ساختن d1,d2,d3 هر کدوم از اینا یک فضای stack برای خودشون میگیرن و بصورت جداگانه تابع controlID رو اجرا میکنن (یعنی با این که تابع یکیه ولی تابعی که داره داخل هر کدوم اجرا میشه کاملا با بقیه متفاوته ) یا به عبارتی تابع control id داره همزمان داخل 3 تا threadمجزا استفاده میشه
بعد حالا join برای اینه که thread ای که داخلش هستیم pause کنه تا اون thread ای که می خوایم کارش تموم بشه .
این برنامه میشه گفت داره این طوری کار می کنه  .
قبل از رسیدن به f باید d1,d2,d3 کارشون تموم بشه . (کار join داخل main )
قبل از تمومش شدن کار d1 باید t0,t1,t2 کارشون تموم بشه (کار join داخل تابع کنترل همینه )
قبل از تمومش شدن کار d2 باید t3,t4,t5 کارشون تموم بشه
قبل از تمومش شدن کار d3 باید t6,t7,t8,t9 کارشون تموم بشه
همه ی اینا رو متوجه شدم.سوال من اینه که برای اجرای d ها ما سه تا thread داریم که داخل کد پشت سر هم نوشتیم.خب مگه این سه تا d نباید همزمان اجرا بشند؟مثلا برای c ها اومدیم به اندازه ی n تا thread رو new کردیم تا باهم در یه خط اجرایی قرار بگیرند ولی برای d انگار هرکدوم یه خط اجرا دارند؟
آهان . آره درسته هر کدوم به ترتیب شروع  اجرا میشن ولی این قدر زمان اجرا شدن هر خط کمه که میشه ازش صرف نظر کرد . ( برای new هم به همین شکله هر کدوم با یک تاخیر خیلی خیلی کوچیک اجرا میشن در حد مثلا 1 میلیونیم ثانیه !)
من برای thread خیلی سرچ کردم ولی چیزی که مد نظر من از این مبحث باشه رو پیدا نکردم.یعنی بیشتر در مورد سیستم عامل و ..  بود تا برنامه نوسیش.شما منبعی تو اینترنت سراغ ندارید که مثال هم داشته باشه.
از بابتون جوابتون هم ممنون.کامل فهمیدم
اگر میخواین کاملا همزمان اجرا بشن روش هایی هست مثل استفاده از Barrier  
http://goo.gl/2t4oXD
که بصورت ساده کارش اینه که همه ی thread ها رو تا وقتی که همشون با هم به محل مشخص نرسن متوقف می کنه .
...