2013-04-27 54 views
0

我想實現合併排序旗語,我有一些麻煩讓我的代碼運行:合併執行旗語

sem_t *sem; 
pthread_t *t; 

void *parallel_merge_sort(void *thread_id) 
{ 
int a = *((int *) thread_id); 
printf("%d. in sort\n",a); 
fflush(stdout); 
sem_post(&(sem[a])); 
if(a % 2) 
    sem_wait(&(sem[a-1])); 
else 
    sem_wait(&(sem[a+1])); 

printf("%d. out sort\n",a); 
fflush(stdout); 
} 

void main() 
{ 
int P = 2,i;  

t = calloc(P,sizeof(pthread_t)); 
sem = calloc(P,sizeof(sem_t)); 

printf("threads created\n"); 
fflush(stdout); 

for(i=0;i<P;i++)  
    pthread_create(&(t[i]),NULL,(void*) &parallel_merge_sort,(void *) &i); 

for(i=0;i<P;i++) 
    pthread_join(t[i], NULL); 

    printf("threads end\n"); 
    fflush(stdout); 
} 

此代碼將產生類似以下的輸出:

threads created  
0. in sort  
0. in sort 

在此之後,它不會繼續運行並等待。

問題是什麼,我該如何解決?

回答

0

不能保證新線程立即啓動。這意味着你不能使用指向索引的指針,因爲變量在線程啓動之前可能會改變。

在這種情況下,直到主線程進入第二個循環,其中變量i被重置爲零,因此兩個線程將具有相同的索引,使得兩個線程都嘗試等待相同的信號量。

您可以通過使用「黑客」,並直接通過i作爲指針跳過此:

pthread_create(&(t[i]),NULL,(void*) &parallel_merge_sort,(void *) i); 

而在線程函數做:

int a = (int) thread_id; 
+0

感謝了很多,它可以完美運行 – xxlali 2013-04-27 17:24:24