2017-05-29 27 views
0

我傳遞結構,其中包含一個char *在pthread_create我鎖定的主要和互斥鎖的線程,所以我可以保護這個字符串,因爲當第二個線程將創建的字符串會改變,第一線程將使用第二個字符串,而不是第一個字符串。下面是代碼:的pthread_mutex_lock僅適用於睡眠

的main.c

while(th_num < th_size) 
{ 
    pthread_mutex_lock(&lock); 

    received = 0; 

    /* Read the desired readable size */ 
    if(read(newsock, &size, sizeof(size)) < 0) 
    { perror("Read"); exit(1); } 

    /* Read all data */ 
    while(received < size) 
    { 
     if((nread = read(newsock, buffer + received, size - received)) < 0) 
     { perror("Read"); exit(1); } 

     received += nread; 
    } 

    printf("Received string: %s\n",buffer); 


    Q->receiver = (char*) malloc(sizeof(char)*strlen(buffer)+1); 
    strncpy(Q->receiver, buffer, strlen(buffer)+1); 

    if((err = pthread_create(&thread_server[th_num], NULL, thread_start, (void*) Q)) == true) 
    { show_error("pthread_create", err); } 
    /* -------------------------------------------------- */ 


    th_num++; 

    pthread_mutex_unlock(&lock); 
    usleep(500); 
} 

pthread_server.c

pthread_mutex_lock(&lock); 
/* 
do some stuff here 
*/ 
pthread_mutex_unlock(&lock); 

程序工作正常,但問題是,它只是如果我把usleep(500)的作品。我的猜測是線程無法及時鎖定互斥鎖,因此需要睡眠才能正確執行此操作。有沒有辦法做到這一點沒有usleep()?

+1

沒有睡覺,幾乎是互斥解鎖之後的下一個指令是一個新的互斥鎖 - 這樣的互斥鎖定幾乎所有的時間。 (在解鎖和鎖之間有一個循環跳轉和測試,但僅此而已。)這總是會導致問題。互斥量必須保持最短時間,以防止其他線程被鎖定。您需要確保您可以在不保留互斥鎖的情況下進行有用的工作。當然,睡眠使其他線程有機會執行。 –

+0

這裏那是一點,當主解鎖互斥體的線程將鎖定它,所以當主會試圖鎖定互斥體再次將堆疊,直到該線程釋放它。這幫助我,因爲我不希望主要在第一個線程完成之前更改字符串。我不明白爲什麼互斥鎖始終處於鎖定狀態? – P3ett

+0

沒有睡覺,還有除了偶然的線程都有機會鎖定解鎖與鎖之間的互斥主代碼沒有辦法。它們在文本上「相距甚遠」,但它們按非常接近的順序執行。所有讀取和分配的東西都很耗時。你需要重新思考你在使用這個互斥量。沒有足夠的代碼讓我們知道你在做什麼。我們可以看到,這些讀取可以無限期地掛起。如果您不希望主程序修改字符串,請將字符串的副本傳遞給線程,線程將其釋放。 –

回答

0

假設我不明白爲什麼你需要調用pthread_create();在代碼中的互斥部分,你的問題是:

您使用的線程,但是你的程序的流量接近是連續的大的,因爲代碼的互斥部分。

讓你的程序X的通用線程。

沒有usleep(500);當X線程完成時,它釋放與pthread_mutex_unlock(&lock);互斥,但之後線程X重新獲得鎖定,因此沒有其他人可以訪問互斥部分的代碼。

現在我不知道你的共享數據是什麼,所以我只能建議你:

1)減少代碼的互斥部分,只有當你訪問一個共享的數據使用;

2)重新考慮你的程序結構。