folder Tahribat.com Forumları
linefolder C#, Asp.Net, .Net Core
linefolder C# Task Parallel Library Sorusu



C# Task Parallel Library Sorusu

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek

    1-) C# Syntax'ını fazla bilmiyorum.

    Paralel programlama dersinde OpenMP ve Pthreads gördükten sonra (C++) şimdi C# ile  TPL'e geçtik. Bir adet sorunum var.

     

    2 tane metod yazdım onları kullanıyorum.

    a-)static string actionWithReturnValue(string returnValue)

    **********a metodu aldığı argumanı 5 sn sonra geri gönderiyor sonuç olarak. Başka bi bok yapmıyor

    b-)static void actionWithArgument(string arg, int yazdirmaSayisi)

    **********b metodu aldığı argumanı ve Task.ID sini yazdırıp, 5 sn sonra tekrar yazdırıyor ve sonlanıyor.

     

    Metodlardan oluşturulan tasklara parametreleri şu şekilde yolluyorum. Örneğin kullanıcı 3 sayısını girdi.

    a-) 0arguman,1arguman,2arguman

    b-) {0,1},{1,1},{2,1}

     

    Sorunum: Program genellikle son argumanı yazdırıyor. Bunun bir sebebi mi var ben mi bir yanlış yapıyorum?

     

     

     

    Kodlar aşağıda:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Threading;
    
    namespace ParalelProgramlamaDotNetDenemeleri
    {
        class Program
        {
            static void action()
            {
                Console.WriteLine("Geri Dönüş değersiz, Parametresiz Thread Başlatıldı, TID:{0}", Task.CurrentId);
               // Thread.Sleep(2000);
                Console.WriteLine("Geri Dönüş değersiz, Parametresiz Thread Bitti = X,TID:{0}", Task.CurrentId);
            }
    
            static void actionWithArgument(string arg, int yazdirmaSayisi)
            {
                for (int i = 0; i < yazdirmaSayisi; i++ )
                    Console.WriteLine("Geri Dönüş değersiz, arg:{1} Thread Başlatıldı, TID:{0}", Task.CurrentId, arg);
                Thread.Sleep(5000);
                Console.WriteLine("Geri Dönüş değersiz, arg:{1} Thread Bitti, TID:{0}", Task.CurrentId, arg);
            }
    
            static string actionWithReturnValue(string returnValue)
            {
                Thread.Sleep(5000);
                return returnValue;
            }
            static void Main(string[] args)
            {
    
                Console.WriteLine("Lütfen oluşturulacak thread sayısını girin:");
                int sayi = Convert.ToInt32(Console.ReadLine());
                List<Task> tListesi = new List<Task>();
                for (int i = 0; i < sayi; i++ )
                {
                    Task t = new Task(() => actionWithArgument(i.ToString(),1));
                    tListesi.Add(t);
                    t.Start();
                }
                Task.WaitAll(tListesi.ToArray());
                tListesi.Clear();
                List<Task<string>> tListesi2 = new List<Task<string>>();
                for (int i = 0; i < sayi; i++ )
                {
                    Task<string> t = new Task<string>(() =>
                    actionWithReturnValue(i.ToString() + "arguman"));
                    tListesi2.Add(t);
                    t.Start();
                }
                foreach(Task<string> t in tListesi2)
                {
                    Console.WriteLine(t.Result.ToString());
                }
    
                    Console.WriteLine("Bitirmek için bir tuşa basın");
                Console.ReadKey();
            }
    
        }
    }
    

            


    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    vayy tpl he :) türkiye de mi okuyorsun hocam? yani tr de böyle bir şey gösteriyorlar üniversitede helal olsun diyorum..

    soruna gelince, aslında bir sorun değil gösterim ile ilgili bir problem olduğunu düşünüyorum, ben de java da multi-core testleri yaptığımda bu tarz farklı şeyler yazdırıyordu.. aynı şekilde contiki de de böyle farklı farklı geliyor.. kodda sorun yok ama yazdırma işleminden kaynaklı şeyler var.

     

    tam emin olmak için daha basit şeylerle dene. tek parametre girerek yapmaya çalış.. sonra biraz daha bi şeyler ekle, sleeping süresini arttır-azalt.... haftaiçi unutmazsam ben de bakarım bunlara.. zevkli konulardır 


    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek
    unbalanced bunu yazdı

    vayy tpl he :) türkiye de mi okuyorsun hocam? yani tr de böyle bir şey gösteriyorlar üniversitede helal olsun diyorum..

    soruna gelince, aslında bir sorun değil gösterim ile ilgili bir problem olduğunu düşünüyorum, ben de java da multi-core testleri yaptığımda bu tarz farklı şeyler yazdırıyordu.. aynı şekilde contiki de de böyle farklı farklı geliyor.. kodda sorun yok ama yazdırma işleminden kaynaklı şeyler var.

     

    tam emin olmak için daha basit şeylerle dene. tek parametre girerek yapmaya çalış.. sonra biraz daha bi şeyler ekle, sleeping süresini arttır-azalt.... haftaiçi unutmazsam ben de bakarım bunlara.. zevkli konulardır 

    Aynen hocam Türkiye'de okuyorum. Ayrıca bir soru daha sormak istiyorum. Task sınıfı ile Thread sınıfının farkı nedir? Şimdi anladığım kadarıyla C++ daki (ekstra pthread kütüphanesi ya da C++11 ile gelen thread sınıfı) gibi sonuç gelmeden önce join yapmama gerek yok C# da. Eğer sonuç bekliyorsam otomatik join yapıyor. Ayrıca memorry leakleriyle felanda uğraşmama gerek yok. Ama farkını tam anlayamadım.


    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    şimdi yatacağım hocam, p.tesi sınav var daha çalışamadım bile işim zor :) 

    şuralara bak olmadı yine konuşuruz sonra

     

    http://blog.slaks.net/2013-10-11/threads-vs-tasks/

    http://stackoverflow.com/questions/4130194/what-is-the-difference-between-task-and-thread

    http://stackoverflow.com/questions/13429129/task-vs-thread-differences

     edit: pluralsight ın paralel programlama ile ilgili eğitimleri vardı hocam.. onları internetten bulup indir.. faydalı şeyler var.. 

    unbalanced tarafından 25/May/14 04:00 tarihinde düzenlenmiştir

    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek
    unbalanced bunu yazdı

    şimdi yatacağım hocam, p.tesi sınav var daha çalışamadım bile işim zor :) 

    şuralara bak olmadı yine konuşuruz sonra

     

    http://blog.slaks.net/2013-10-11/threads-vs-tasks/

    http://stackoverflow.com/questions/4130194/what-is-the-difference-between-task-and-thread

    http://stackoverflow.com/questions/13429129/task-vs-thread-differences

     edit: pluralsight ın paralel programlama ile ilgili eğitimleri vardı hocam.. onları internetten bulup indir.. faydalı şeyler var.. 

    Aramanın gücü işte. Çok saolasın hocam Thread ve Task arasındaki temel farkları anladım.


    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek

    Kod üzerinde biraz değişiklikler yapıp WaitAny() gibi fonksiyonları test ediyordum . Sorunu daha önceden yaşadığım için çözdüm.. Bir anda pthread'de karşılaştığım hata aklıma geldi. Bunun aynısı idi hata. Aynı sıkıntıyı yaşayanlar olursa diye tbt ailesine yazayım sebebini.

     Ne zaman FOR döngüsündeki sayacı(i) arguman olarak göndersem, ÇOĞU zaman sayaç(i) argumanının son değerini threadler işliyordu. Bunun sebebi pthread_create fonksiyonunda yatıyor zaten...

    int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                              void *(*start_routine) (void *), void *arg);
     

    pthread ile fonksiyon kullanabilmek için fonksiyonu void* argumanı alan bir fonksiyon şeklinde dizayn etmek gerekiyor. (ANSI C yapısından dolayı, birden fazla veri tipli fonsksiyonları pthread ile kullanmak amacıyla böyle yapıldığını düşünüyorum [ ansi c de themplate desteği yok bildiğim kadarıyla])

    Fonksiyon parametre olarak değişkenin adresini aldığı için ve for döngüsü çok hızlı bir şekilde işlediği için ilk çalışan threadler dahi çoğu zaman argumanı işleyinceye kadar, i:sayacı son haline gelmiş oluyor.  Doğal olarak kendisine verilen adresteki veriye, for döngüsü bittikten sonra ulaşmaya çalışan thread i:sayacının son halindeki değeri işleyebiliyor. (Ama hala anlamam ki, for döngüsü bittikten sonra SAYAÇ olan int i değişkenine threadler nasıl erişebiliyor. Çünkü sayaç olan i bir lokal değişken olduğu için for döngüsü bittiğinde bellekten silinmesi lazım)

     

    C# dada muhtemelen TASK sınıfında fonksiyonlara arguman yollarken Pass by Referance ya da Pass by Adress sistemi kullanılıyor. Pass by value olmuyor sanırım threadlerde. Bu yüzden bu hatayı aldım sanırım. Yolladığım argumanın, Thread argumana erişinceye kadar değişmediğini garanti altına almam gerekiyor.Aşağıdaki ilk kod sorunsuz çalışıyor. Hatta teorimi desteklemek için aşağıdaki ikinci kodu yazdım ve çoğu zaman güle güle tbt yazdırıyor ve söylediğim teoriyi destekliyor. Kolay gelsin herkese.

    Aşağıdaki kodlarda bir sıkıntı yaşamadım.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Threading;
    
    namespace ParalelProgramlamaDotNetDenemeleri
    {
        class Program
        {
            static void action()
            {
                Console.WriteLine("Geri Dönüş değersiz, Parametresiz Thread Başlatıldı, TID:{0}", Task.CurrentId);
                // Thread.Sleep(2000);
                Console.WriteLine("Geri Dönüş değersiz, Parametresiz Thread Bitti = X,TID:{0}", Task.CurrentId);
            }
    
            static void actionWithArgument(string arg, int yazdirmaSayisi)
            {
                for (int i = 0; i < yazdirmaSayisi; i++)
                    Console.WriteLine("Geri Dönüş değersiz, arg:{1} Thread Başlatıldı, TID:{0}", Task.CurrentId, arg);
                Thread.Sleep(1000);
                Console.WriteLine("Geri Dönüş değersiz, arg:{1} Thread Bitti, TID:{0}", Task.CurrentId, arg);
            }
    
            static string actionWithReturnValue(string returnValue)
            {
                Thread.Sleep(1000);
                return returnValue;
            }
            static void Main(string[] args)
            {
    
                Console.WriteLine("Lütfen oluşturulacak thread sayısını girin:");
                int sayi = Convert.ToInt32(Console.ReadLine());
                List tListesi = new List();
                for (int i = 0; i < sayi; i++)
                {
                    int argumanSayi = i;
                    Task t = new Task(
                        () => actionWithArgument(argumanSayi.ToString(), 1)
                    );
                    tListesi.Add(t);
                    t.Start();
                }
                while (tListesi.Count > 0) //WaitAny ile listeyi boşaltma
                {
                    int indexOfListArray = Task.WaitAny(tListesi.ToArray());
                    Task t = tListesi[indexOfListArray];
                    tListesi.Remove(t);
                }
                Console.WriteLine("Listede:" + tListesi.Count + " eleman kaldı");
                List<Task> tListesi2 = new List<Task>();
                for (int i = 0; i < sayi; i++)
                {
                    int argumanSayi = i;
                    Task t = new Task(
                        () => actionWithReturnValue(argumanSayi.ToString() + "arguman")
                    );
                    tListesi2.Add(t);
                }
                Random rnd = new Random();
                int randomSayi = rnd.Next(tListesi2.Count());
                Console.WriteLine("2. Listede {0} tane task var. Bunların {1} tanesi çalıştırılacak", tListesi2.Count(), randomSayi);
                List<Task> calismisList = new List<Task>();
                for (int i = 0; i < randomSayi; i++)
                {
                    calismisList.Add(tListesi2[i]);
                    tListesi2[i].Start();
                }
                tListesi2.Clear();
                foreach (Task t in calismisList)
                {
                    Console.WriteLine(t.Result.ToString());
                }
    
                Console.WriteLine("Bitirmek için bir tuşa basın");
                Console.ReadKey();
            }
    
        }
    }
    
    // ikinci test program... Teorimi deskteliyor mu bakalım
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Threading;
    
    namespace ParalelProgramlamaDotNetDenemeleri
    {
        class Program
        {
            static void action()
            {
                Console.WriteLine("Geri Dönüş değersiz, Parametresiz Thread Başlatıldı, TID:{0}", Task.CurrentId);
               // Thread.Sleep(2000);
                Console.WriteLine("Geri Dönüş değersiz, Parametresiz Thread Bitti = X,TID:{0}", Task.CurrentId);
            }
    
            static void actionWithArgument(string arg, int yazdirmaSayisi)
            {
                for (int i = 0; i < yazdirmaSayisi; i++ )
                    Console.WriteLine("Geri Dönüş değersiz, arg:{1} Thread Başlatıldı, TID:{0}", Task.CurrentId, arg);
                Thread.Sleep(1000);
                Console.WriteLine("Geri Dönüş değersiz, arg:{1} Thread Bitti, TID:{0}", Task.CurrentId, arg);
            }
    
            static string actionWithReturnValue(string returnValue)
            {
                Thread.Sleep(2000);
                return returnValue;
            }
            static void Main(string[] args)
            {
    
                string metin = "Merhaba TBT";
                Task t = new Task(() => actionWithReturnValue(metin));
                t.Start();
                metin = "Güle güle tbt";
                Console.WriteLine(t.Result.ToString());
                Console.ReadKey();
            }
    
        }
    }
    
    DrKill tarafından 25/May/14 19:22 tarihinde düzenlenmiştir

    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    ekran görüntülerini koyar mısın hocam.. deneme şansım yok şu aralar


    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek

     

    http://oi60.tinypic.com/r0wc5e.jpg

    http://oi60.tinypic.com/ayt1qf.jpg

    http://oi59.tinypic.com/30j412f.jpg

    DrKill tarafından 25/May/14 12:47 tarihinde düzenlenmiştir

    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
Toplam Hit: 1119 Toplam Mesaj: 8