除了其他言論,
pthread_create(&thr[i], 0, makeRequest, &i);
是不正確的,因爲i
是一個局部變量,所以&i
是相同的指針在您撥打的所有電話pthread_create
您通常應該使數據指針指向您的線程例程 - 這裏的線程例程是makeRequest
靜態指針或唯一指針(每個線程都是唯一的);在實踐中,使其成爲一些指向一些記憶的指針。
一個更好的做法是聲明一些struct my_thread_data_st
,與
struct my_thread_data_st* td = malloc(sizeof(struct my_thread_data_st));
if (!td) perror("malloc td"), exit(EXIT_FAILURE);
memset (td, 0, sizeof(struct my_thread_data_st));
// fill td appropriately, then
pthread_create(&thr[i], 0, makeRequest, td);
唯一分配它在堆或者你可以有例如數組int
-s,例如int num[4];
,適當地初始化它,然後pthread_create(&thr[i], 0, makeRequest, &num[i]);
當然,如果td
是堆分配通malloc
,在適當的時間,例如不要忘記free
它在線程結束之後(例如在擁有pthread_join之後)。您可能也會對Boehm's GC感興趣,並使用GC_malloc
而不是malloc
(然後,不要擔心釋放內存,GC會這樣做)。
如果線程訪問共享數據,您(使用pthread_mutex_lock
& pthread_mutex_unlock
)應連續訪問它與一些[全局或靜態]互斥
不要忘記在退出之前調用pthread_join
在所有線程-例如從main
返回。
我建議你閱讀一下pthreads tutorial和一些關於advanced linux programming的書。
非常感謝您的非常詳細的答案,它幫助我進行了很多堆內存分配。 – NiCU