2016-04-06 19 views
0

C'deki iş parçacıklarıyla ilk defa çalışıyorum ve işlev argümanlarını iletirken sorun yaşıyorum. Bazı nedenlerden dolayı bu konuya ihtiyacım var. Bir sunucuya mesaj gönderen bir işlev var. Benim fonksiyonunun başlığıdır:C - pthread bağımsız değişkenler

void* sender (char* payload, void (*Callback)(char*)) 

Sonra benim ana (basitleştirilmiş), aşağıdaki iş parçacığı oluşturulamadı:

main() 
{ 
    pthread_t sender_id; 
    int err_s; 

    err_s = pthread_create (&sender_id, NULL, &sender, NULL); 
} 

sorun benim fonksiyon gönderen bu soruyla o kadar çok argüman olmasıdır Hata:

note: expected 'void * (*)(void *)' but argument is of type 'void * (*)(char *, void (*)(char *))' 

Eğer birileri bana yardım ederse ben minnettar olurum.

+4

Bu mümkün değildir. Bir iş parçacığı içinde kullanılabilen her işlevin imzası olmalıdır: void * thread_func (void * arg). Bunun yerine iki argüman yükünü ve geri aramayı içeren bir struct kullanmanızı öneririm. –

cevap

0

Sadece bir yapıyı oluşturabilir diyelim:

struct thread_prm 
{ 
char *payload; 
void (*Callback)(char*) cb; 
} 

Ve sadece şöyle bir yapıyı tahsis ve son argüman olarak pthread_create geçmektedir. Şunun gibi:

struct thread_prm *arg; 
arg = malloc(sizeof(struct thread_prm)); 
(assign arg members to something) 
pthread_create(&sender_id, NULL, &sender, arg); 

Ve gönderen değiştirin:

void* sender (void *arg) 
{ 
struct thread_prm *_arg = arg; 
char* payload; 
void (*Callback)(char*) cb; 

payload = _arg->payload; 
cb = _arg->cb; 
... 
} 
+1

Herhangi bir nedenle gönderen işlevinin imzasını değiştiremezseniz, bu yapıyı void * olarak alan bir sarmalayıcı işlevi oluşturun ve gönderen ile kullanılacak şekilde yayınlayın – klog