Şöyle birşey denedim.threadlar ayrı ayrı üçle çarpacaklar.4 fonksiyonda birisi toplama biri çarpma biri çıkarma biri bölme yapacak.Sonuclar her seferinde random çıkıyor.Acaba yanlışı nerede yapıyorum.Teşekkürler

#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
void *fonk1(void *);
void *fonk2(void *);

sem_t sem;

int main()
{

sem_init(&sem,0,0);
int sayi1 = 10  , sayi2 = 20 ;
pthread_t td1 , td2;

pthread_create(&td1,NULL, fonk1,(void *)&sayi1);
pthread_create(&td2,NULL,fonk2,(void *)&sayi2);

void *a;
void *b;

pthread_join(td1,&a);
pthread_join(td2,&b);

printf("toplam : %d \\\\n", (*(int *)a) + (*(int *)b) );
printf("carpim : %d \\\\n", (*(int *)a) * (*(int *)b) );
printf("fark   : %d \\\\n", (*(int *)a) - (*(int *)b) );
printf("bol    : %d \\\\n", (*(int *)a) / (*(int *)b) );
sem_post(&sem);
sem_destroy(&sem);

exit(0);

}

void *fonk1(void *x)
{
int *a ;
a = (int *)x;
*a = *a*3;
sem_post(&sem);
pthread_exit((void *)&a);
}

void *fonk2(void *y)
{
int *yy ;
sem_wait(&sem);
yy=(int *)y;
*yy = *yy*3;
sem_post(&sem);
pthread_exit((void *)&yy);
}

soruldu: 16 May '14, 16:31

fatih3455's gravatar image

fatih3455
3171013
cevap kabul oranı: 0%


Mutlithreding uygulama ve pointer ile aynı anda çalışıldığında karşılaşılan bir problem var : işlem sıralaması nasıl olacak? Bu iki kavram (pointer ve mthreding)işlemcinin ve işletim sisteminin çalışma şekline müdahale demektir. Dolayısıyla süreci adım adım yönetmen gerekir. Yani toplam fonksiyonunu çağırdın ve 10ms sn sürdü diyelim. Nerdeyse aynı anda çarpım fonksiyonunuda çağırdın ve 5ms sn sürdü. Sonuç önce çarpım sonra ise toplama gibi davranacak. Ancak bu işlem süreleri değişkendir. Eğer çarpım 3ms ve toplam ise 5ms saniye de biterse yine farklı sonuç çıkacaktır. Normalde bu sıralamyı ve süreleri işletim sistemi ve CPUnun gücü belirler. Bu kod her bilgisayarda ve her çalıştırmada işlemadedi! (n!) farklı ihtimalden birini verecektir. Ancak multithredinge geçtiğinde işe artık sen yönetmen gerekir. Üstelik birde pointer kullandığın için sonucun farklı çıkması kaçınılmaz olur. Her işleme ayrı değişkenler gönderseydin ancak o zaman doğru sonuç alabilirdin. Çözümün c++ taki karşılığını bilmiyorum ancak c# karşılığı delegate dir. Biraz araştırmayla bulunur sanırım. Delegatelerde A threadi bittiğinde B işlemini yap gibi bir yöntem izleyebilirsin.

Ayrıca delegate kullanırsan artık multithreading kullanmamaktan (bu örnek özelinde) farkı kalmayacak. Bu örnek kod multithreadingin kullanımı için uygunsuz aslında, asıl amacı thread kullanmanın dezavantajını veya zor yanlarını göstermek olabilir. Multithreading de amaç paralel işlem yaptırarak performans arttırmak. Ancak pointer işin içine girdiğinde multithreading yönetilmesi çok zor hale gelir. Daha detaylı araştırma için "asenkron yazılım" kavramını araştırabilirsin.

permanent link

cevaplandı: 17 May '14, 08:14

osmanraifgunes's gravatar image

osmanraifgunes
2.4k81736
cevap kabul oranı: 31%

değiştirildi: 17 May '14, 18:28

cevabınız için teşekkür ederim.çok açıklayıcı oldu.c# 'da o mevzuyu ben de duymuştum.ancak bana kodun c / c++ olanı lazım.yukarıdaki mevzu gibi çözmem gerekiyor.3 sn biri 5 sn diğeri çalışırsa sorun çıkacağından bahsetmişsiniz.onu da semaphore ile çözmem isteniyor.yani thread lar birbirine karışmadan herkez kendi işlevini yaparak ana fonksiyona dönmesi isteniyor.teşekkürler

permanent link

cevaplandı: 18 May '14, 03:50

fatih3455's gravatar image

fatih3455
3171013
cevap kabul oranı: 0%

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×45
×42
×31
×1

Soruldu: 16 May '14, 16:31

Görüntüleme: 920 kez

Son güncelleme: 18 May '14, 03:50

powered by BitNami OSQA