Tam Sürümünü Görmek İçin : yardım:multi-threading ile integral hesabı?
slm arkadaşlar.
forumda thread ler ile ilgili makaleleri okudum.paylaşan arkadaşlara teşekkürler.
benim sorunum ise c ile multi-threading kullanarak integral hesabını yazmak.belli bi yere kadar gelip threadleri oluşturdum(8 thread ile yapıyorum) fakat bu thread lerin birbirleriyle bağlantı kurmasında sorunum var.benim threadler programı paylaşarak yapmak yerine hepsi aynı sonuçu ayrı ayrı üretiyor. bu konu hakkında yol gösterecek arkadaşlar olursa sevinirim.
herkese kolay gelsin...
integral hesabını simpson ya da benzeri bir yöntem ile
bir dizi üzerinde yapıyorsundur.
bunun için thread kullanımına gerek olduğunu zannetmiyorum.
thread ler,
-sistemin işlem hızının değiştiği yerlerde ( genelde IO ).
mesela dosya okuma/yazma, internet bağlantısı vs...
-bir işlemin, diğerinin işleyişini kontrol etmesi gerektiğinde.
mesela bir butona basarak uzun sürecek bir işlemi iptal etmek için.
vs..
gibi uygun yerlerde faydalı.
ama mutlaka kullanıcam diyorsan,
integral alacağın aralığı thread lere paylaştır.
0-500 arasını birisi, 501-1000 arasını bir başkası gibi..
her thread bitirdiği işlemin sonucunu bir değişkene ekleyebilir.
ekleme işini yapan fonksiyonu thread-safe yapman lazım.
IcenGuard
02/04/2007, 20:59
ek olarak iş yükünü farklı islemcilere/bilgisayarlara dağıtmak için kulanılır.
google da "c++/c thread integral" diye aratırsan gerekli algoritmaları bulabilirsin.
ilgilendiğiniz için teşekkürler
konu hakkında pek bilgim yok,araştırmaya devam ediyorum. bahsettiğim problem ödev olduğu içinde threadlerle yapmak zorundayım:(
yardımlarınız için tekrar teşekkürler...
CompEngineer
02/04/2007, 22:55
bu thread lar nedir arkadaslar biraz daha aciklayabilirmisiniz ilk kez duyuyorumda
acehreli
02/04/2007, 23:03
Thread'in Turkcelerinden birisi "isletim dizisi"dir. Programin ayni anda birden fazla is yapmasini saglarlar.
rboozer'in istedigi gibi bir uygulamada ana isletim dizisi yavru isletim dizileri baslatir, onlarin islerini bitirmelerini bekler. Sonunda sonuclari alir, isler, vs.
Ali
Thread'in Turkcelerinden birisi "isletim dizisi"dir. Programin ayni anda birden fazla is yapmasini saglarlar.
rboozer'in istedigi gibi bir uygulamada ana isletim dizisi yavru isletim dizileri baslatir, onlarin islerini bitirmelerini bekler. Sonunda sonuclari alir, isler, vs.
Ali
sanıyorum thread için Türkçe 'de çoğunlukla 'kanal' kelimesi kullanılıyor. en azından bendeki bir java kitabında öyle ama belki başka yerlerde başka şekilde tercüme etmişlerdir.
Diyelim
Bir ev yapılması gerekiyor.
1. Tum malzemeyi(cekic,kazma,tugla ...vb) yanibasına cekip yavas yavas yapabilirsin. Eger gercekten de cok elemana ihtiyac yoksa ve zamanın da varsa kulaga hos geliyor. :)
2. Bir kac eleman tutarsın Malzemeyi ve gorevleri paylaştırırsın (Burası onemli) ve hizli bir sekilde yaparsın.. Burada zaman onemli bir etken oluyor. dikkat edilmesi gereken sey ise
Bir elemanın yaptıgı işi baska birinin tekrardan yapmaması.(Gorev Dagılımı)
Yeterince cekic/civi ve tugla olmalıdır aksi halde elemanlar cekic falan yokken beklerler. (Kaynak Dagılımı)
Eger farklı kabiliyetleri olan elemanlarınız varsa onları oncelik sırasına koymalısınız.
...... Falan filan :)
Buradaki thread = işi yapan kişi veya kişiler...
Sanırım soyle bir benzetme yapmak yanlış olmaz..
Kolay Gelsin
Euclides
03/04/2007, 19:32
Aslında bence biraz yanlış olur. Çünkü gerçekte "işi yapan kişiler"'den cpu sayısı kadarı aynı anda iş yapabilir. yada bir başka değişle 1 tane cpu'nuz 3 tane thread'iniz var ise 2 thread aynı anda çalışamaz...
Cogumuzun bilgisayarı Tek CPU'ludur...
Kaynakların kullanılması konusunda elinizin mahkum oldugu bir kaynak..
Gercekte Elemanlar asla aynı anda faklı işler yapmazlar. Ama CPU o kadar hızı bizi yanıltıyo :)...
sizce doğru yerdemiyim? ben pek emin değilimde
iyi çalışmalar herkese....
int main(...){
HANDLE hthread;
unsigned long threadID;
for(i=0;i<8;i++){
hthread=CreateThread(NULL,0,&T,NULL,NULL,&threadID);
printf("yaratildim\n");
printf("id=%lu\n",threadID);
}
double sum;
double integral[8];
for(i=0;i<8;i++){
WaitForSingleObject(hthread,INFINITE); //????
sum=sum+integral[i];
}
printf("%f\n",sum);
return 0;
}
DWORD WINAPI T(...){
int i;
double integral[8];
for(i=0;i<8;i++){
integral[i]=Integral((0+(i*2.5)+0.1),(2.5+(i*2.5)),N);
//integral fonk. buraya yazmadım.0-20 aralığı için diziye atmaya çalıştım
printf("%f\n",integral[i]);
}
winapi bilmiyorum, aşağıdakiler yorumdur.
internette birkaç örnek var onlara baktım,
mfc kullanabiliyorsan CMutex kolay görünüyor.
for(i=0;i<8;i++){
hthread=CreateThread(NULL,0,&T,NULL,NULL,&threadID );
burada 8 thread yaratıyorsun ama , 7 sinin handle ını kaybediyorsun.
double sum;
double integral[8];
for(i=0;i<8;i++){
WaitForSingleObject(hthread,INFINITE); //????
sum=sum+integral[i];
}
burada 8 kez aynı thread'i bekliyorsun,
ve integral dizisi bu kapsam da tanımlı değil.
T fonksiyonu içerisinde tanımlı.
( bu nasıl oluyorda hata vermiyor ? )
benim önerim,
sum değişkenini global olarak tanımla,
bir mutex objesi yarat ( global ),
her thread'e hesaplayacağı integral aralıklarını gönder,
her thread hesabını bitirdikten sonra, mutex objesini kilitlesin ve sum a yazsın.
sonra mutexi açsın ( unlock ) .
acehreli
04/04/2007, 21:48
mr1yh1'in soyledigi gibi yapinca mutex'lerle de oynamis olacaksin.
Ama aslinda gerek yok: thread'ler baslatildiklarinda onlara kendilerine ait bir yapi gosteririz. (Yukaridaki CreateThread cagrilarinda NULL gonderildigi icin bundan yararlanilmiyor.) Her thread kendi sonucunu kendisine gosterilen yere yazar...
Ana thread de sonra butun thread'ler islerini bitirince hepsinin sonuclarini degerlendirir.
Ali
Benim de corbada tuzum bulunsun hesabıyla...
Fonksiyon : F(X)=2X + 5
Istenen : fonksiyonun 2 - 5 aralıgındaki integralini bulmak olsun
Integral(2->5) F(x) = Integral(2->3)F(x) + Integral(3->4)F(x) + Integral(4->5)F(x)
Seklinde yazabilecegimize gore...
Sizin yapmanız gerekenler...
1. Integral almanız gereken aralıkları uygun birim aralıklara bolmek.. (Kısacası hangi birim aralıkta integral alacagınızı belirlemek)
2. Bu birim aralıga gore Integral alacak Threadleri olusturmak
3. Bu threadlerin işlerini bitirmelerini beklemek
4. Sonucları toplamak...
Kolay gelsin...
Not: Bunlar benim kendi fikrim baska cozumlerde kullanılabilir...
yardımınız ve fikirlerinizi paylaştığınız için teşekkürler
bu konu ile ilgili birşeyler yapıp belli biryere kadar geldim
ilgilenen arkadaşlara ayrıca örnekleri ve benim yazmaya çalıştığım kodları gönderebilirim
iyi çalışmalar...
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.