2016-04-08 31 views
-1

bir iş parçacığının başlat işlevine basit bir tamsayı getirin Kod örneğidir, yapmam gereken şey değiştirmek.Bir iş parçacığı oluşturma işlevine

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

void *my_function (void*); // Function for the thread 

int main() 
{ 
    pthread_t my_thread ; // Declare a thread identifier 
    int rc1, x = 7; 

    // Create my_thread 
    if ((rc1 = pthread_create (& my_thread, NULL, & my_function, (void*) &x))) 
    { 
     printf ("Error in creating thread %d\n", rc1); 
    } 

    pthread_join (my_thread, NULL); // wait for thread to exit 

    return (0); // exit the main function 
} 


// The my_thread is created with my_function() which accepts an argument 
void *my_function(void* arg) 
{ 
    int i = *(int*)arg; 

    printf ("The argument which this thread received is %d \n", i) ; 

    pthread_exit (NULL) ; // thread exits 
} 

soru şudur: iplik oluşturma anda parçacığının start fonksiyonu için basit tamsayı geçirin. Ama basit bir tamsayı bir iş parçacığının başlatma işlevine nasıl geçireceğimi bilmiyorum ve ayrıca iş parçacığı oluşturma süresinin ne olduğunu bilmiyorum. senin Yapılanma Modeli (çoğu do) intptr_t varsa

+1

Konu Açma zamanıdır. Bu isim sizi şaşırtabilir, ama sizde var. Şu anda, bir tamsayıyı doğrudan bir tam sayı geçirmekten biraz daha temiz olan iş parçacığına bir tamsayıya geçiriyorsunuz. – EOF

+1

@EOF Bir "int" kelimesini atıfta bulunulduğu gibi, daha temiz bir sorundur, bu, 'pthread_create' çağrısının, güvenli olduğu kadar yeni ileti dizisinden bazı iletiler alınana kadar geçirilen değişkenin değerini korumak zorunda olduğu anlamına gelir. ya değeri değiştirin ya da değişkeni yok edin. Örneğin, her bir iş parçacığının "id" - "0" ile "N - 1" değerini geçtiği "N" iş parçacığı başlayan bir "for" döngüsü. –

cevap

0

, aşağıdaki gibi bir kod değiştirebilirsiniz: Eğer `pthread_create()` çağırdığınızda

int rc1; 
intptr_t x = 7 
... 
pthread_create (&my_thread, NULL, &my_function, (void*)x)); 
... 
void* my_function(void* arg) 
{ 
    intptr_t i = (intptr_t)arg; 
... 
+0

Açıklanamayan downvotes seviyorum. – SergeyA

+1

Reddetmedim, ancak [u] intptr_t' ile ilgili garanti, bir "void *" ile bir "[u] intptr_t" üzerinden, yani "void * -> (u] intptr_t -> void * ', ilk işaretçiye eşit olan bir işaretçi üretir, ancak' [u] intptr_t -> void * -> [u] intptr_t', [u] intptr_t'lerin eşitliğini garanti etmez. – EOF

+0

@EOF, Ben de düşündüm. Ancak, teorik olarak, void -> ptr -> void'in geçerli olduğunu, ancak ptr-> void-> ptr'nin nasıl olduğunu bile göremiyorum. Temel geçişlilik (sanırım bu doğru bir kelime) bunu talep ediyor. Tamam, yukarıdaki arama dönüşümleri aracılığıyla dönüşüm yapan derleyici yok. – SergeyA

İlgili konular