Şimdi Ara

pthreads attributes c++

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir (1 Mobil) - 1 Masaüstü1 Mobil
5 sn
10
Cevap
0
Favori
380
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhaba arkadaşlar, c++'daki pthreads konusunu bilen arkadaşlar yardım edebilirler mi bir noktada takıldım ilerleyemiyorum.

    Daha specific olarak konuşmam gerekirse, pthread'lerdeki attribute'lerin ne işe yaradığını anlamıyorum, şu aşağıdaki örneği bana açıklayabilir misiniz? Bu örnekte attribute'ler ne işe yarıyor bunu açıklayabilir misiniz?


    for döngüsü içinde 4 tane thread create ediliyor bu kısmı anladım. Thread'ler explicit bir şekilde joinable olarak tanımlanmış anladığım kadarıyla pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); satırı sayesinde. Bu da tamam. Şu satırı ise anlamadım: pthread_attr_destroy(&attr); Yani attribute object neden destroy edildi? pthread_join()'i kullanabilmek için mi destroy edildi, bununla mı alakası var, yoksa başka bir nedeni mi var, yani neden free ediliyor attribute object burada ?

    Lİnk:https://computing.llnl.gov/tutorials/pthreads/#CreatingThreads 'da pthread joining başlığı altındaki kod'u alıntılıyorum.

     
    #include <pthread.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #define NUM_THREADS 4

    void *BusyWork(void *t)
    {
    int i;
    long tid;
    double result=0.0;
    tid = (long)t;
    printf("Thread %ld starting...\n",tid);
    for (i=0; i<1000000; i++)
    {
    result = result + sin(i) * tan(i);
    }
    printf("Thread %ld done. Result = %e\n",tid, result);
    pthread_exit((void*) t);
    }

    int main (int argc, char *argv[])
    {
    pthread_t thread[NUM_THREADS];
    pthread_attr_t attr;
    int rc;
    long t;
    void *status;

    /* Initialize and set thread detached attribute */
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

    for(t=0; t<NUM_THREADS; t++) {
    printf("Main: creating thread %ld\n", t);
    rc = pthread_create(&thread[t], &attr, BusyWork, (void *)t);
    if (rc) {
    printf("ERROR; return code from pthread_create()
    is %d\n", rc);
    exit(-1);
    }
    }

    /* Free attribute and wait for the other threads */
    pthread_attr_destroy(&attr);
    for(t=0; t<NUM_THREADS; t++) {
    rc = pthread_join(thread[t], &status);
    if (rc) {
    printf("ERROR; return code from pthread_join()
    is %d\n", rc);
    exit(-1);
    }
    printf("Main: completed join with thread %ld having a status
    of %ld\n",t,(long)status);
    }

    printf("Main: program completed. Exiting.\n");
    pthread_exit(NULL);
    }



    < Bu mesaj bu kişi tarafından değiştirildi loves_oi -- 2 Mart 2015; 2:55:28 >







  • loves_oi L kullanıcısına yanıt
    Anladığım kadarıyla,
    pthread_attr_init(&attr);  

    attr 'in point ettiği object'i initialize ediyormuş(başlatıyormuş),

    O halde doğru anladıysam;
    pthread_attr_t attr; object create ediliyor , object gerçekten burada mı create ediliyor, bilenler teyit edebilir mi?
    pthread_attr_init(&attr); object başlatılıyor
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); // bu object'i kullanan thread'ler joinable olacak

    attr object'i kullanılarak thread'ler create ediliyor, dolayısıyla object'e ihtiyacımız kalmıyor, o yüzden hafızadan aldığımız yeri geri veriyoruz(free ediyoruz), pthread_attr_destroy(&attr); bu kod'u main'den çıkmadan hemen önceki satıra da yazabilirdik, fark etmez.
  • C 'de nesne deyince kafam karıştı biraz :S

    int i;

    ve

    pthread_attr_t attr;

    aynı gibi düşünülebilir mi?

    Yani pthread_attr_t 'yi bir variable type gibi düşünebilir miyiz, int gibi mesela?
  • Hocam çok çok teşekkür ediyorum anladım . Şu son cümlenizde demek istediğinizi anlamadım ama?
    "Eğer referansını kullansaydı threadler sonlanana kadar destroy edemezdin."



    < Bu mesaj bu kişi tarafından değiştirildi loves_oi -- 2 Mart 2015; 21:47:56 >
  • ekdogan E kullanıcısına yanıt
    Ben de tam olarak bu link'lerin çıktısını aldım kaç gündür kasıyorum :)
    Bu 2 link'den hariç bir de şu link'den çalışıyorum :http://www.bogotobogo.com/cplusplus/multithreading_pthread.php

    Hepsi anladım öğrendim vay kolaymış diyordum, sonra pthread_mutex_trylock() nedir bi araştırayım dedim, araştırırken şu siteye denk geldim :http://linux.die.net/man/3/pthread_mutex_trylock
    Bu sitedeki yazıyı okuduktan sonra kafamdaki bilgiler o kadar karman çorman oldu ki, yani artık pthread_mutex_trylock başlığı altında, pthread_mutex_lock 'dan bahsetmiş, pthread_mutex_unlock'dan bahsetmiş, mutex type'larından bahsetmiş, diğer tutoriallar'da mutex type'larından hiç bahsetmemişti, yani şu son site her şeyi allak bullak etti şu anda kafamdaki. Ben mutex type'ı hiç bilmeden mutex'leri anlamıştım, bu mutex type'dan bahsetmiyorlardı diğer tutorial'lar. Acaba bu sitede yanlış bilgi mi var diye bile düşünüyorum



    < Bu mesaj bu kişi tarafından değiştirildi loves_oi -- 5 Mart 2015; 0:57:06 >




  • ekdogan E kullanıcısına yanıt
    ha bu arada pthread_mutex_trylock ne işe yarıyormuş hala anlamadım :) başarılı olursa lock ediyor, başarılı olmazsa error kod return ediyor diye tahmin ediyorum ama okuduklarım hiç anlaşılır şeyler olmadığı için tahminim doğru mu bilmiyorum :))
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • loves_oi L kullanıcısına yanıt
    Multithreading ile synchronization farklı şeyler. Eğer mutex, locks, semaphore, concurrency gibi konseptleri bilmiyorsan önce bir tane operating systems kitabından bunları çalış; ne işe yaradıklarını, nerelerde kullanıldıklarını öğren. İmplementasyona daha sonra geçersin.

    POSIX arayüzündeki çoğu fonksiyon başarılı olursa ilgili değeri; başarısız olurlarsa error code'u return ederler. Manual page'de şöyle yazıyor pthread_mutex_trylock için:

    quote:

    The pthread_mutex_trylock() function shall return zero if a lock on the mutex object referenced by mutex is acquired. Otherwise, an error number is returned to indicate the error.
  • ekdogan E kullanıcısına yanıt
    İkisini multithreading bir şekilde çalışıyorum zaten ;) :)

    Ama Multithreading ile synchronization farklı şeyler diye neden dediniz onu anlamadım? sorunsuz bir şekilde multithread yapabilmek için synchronization önemli değil mi, benim şu an çalıştığım linkler hem multithreading hem synchronization üzerine öyle değil mi?
  • loves_oi L kullanıcısına yanıt
    Hayır multithreading ve synchronization farklı konular. Birden fazla thread/process farklı kaynakları kullanarak pekala concurrent (eşzamanlı) çalışabilirler. İşin işine aynı kaynağın eşzamanlı kullanımı girdiği zaman kimi sıkıntılar (örn. race condition) ortaya çıkabilir. Bu tarz istenmeyen durumları ortadan kaldırmak için bir takım önlemler alıyoruz; örn, locklar, semaphore'lar vb. (Bütün bu işlemlere synchronization diyoruz, adından anlaşıyor zaten.)
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.