簡體   English   中英

試圖了解pthread如何在C中工作

[英]Trying to understand how pthread works in C

我正在嘗試在C中使用pthread比較兩個字符串。 這個想法是看完整的字符串2是否在字符串1中(例如,如果string1 = lkajdsglstring2 = jd那么我將有一個匹配項)。 我不了解pthread如何以一般方式工作。 在這里,我創建我的pthreads,假設NUM_THREADS=3 ,那么我應該有3個線程,線程[0],線程[1]和線程[2]。 每個都將調用Pthrd_Substring函數。 字符串將從文件中讀取並在函數中進行分析。 但是,我不了解的是如何使用pthread_join 如果字符串長度為12個字符,而我只有3個線程,那么系統如何知道繼續使用3個線程來分析字符串,直到檢查完所有12個字符? (該函數查看字符串1中的每個字母,並將其與字符串2中的第一個字母進行比較,然后確定是否存在完整的字符串2。)

int main(int argc, char *argv[])
{
    pthread_t threads[NUM_THREADS];
    int count, rc;
    long t;

    for(t=0;t<NUM_THREADS;t++){
     printf("In main: creating thread %ld\n", t);
     rc = pthread_create(&threads[t], NULL, Pthrd_Substring, (void *)t);
     if (rc){
       printf("ERROR; return code from pthread_create() is %d\n", rc);
       exit(-1);
       }
     }

    printf("The number of substrings is: %d\n", count);
    return 1;
}

我可以使用類似:

pthread_join(threads0, NULL);
 partial_sum += t.partial_count;
pthread_join(threads1, NULL);
 partial_sum += t.partial_count;
pthread_join(threads2, NULL);
 partial_sum += t.partial_count;

並且在功能上具有全局性嗎? 但是,這是否使字符串中的每個字母都得到檢查?


我很猶豫是否包含這部分內容,因為由於我不了解pthread調用在主體中是如何工作的,因此我還沒有全部解決。 但是,這是我對該函數使用的偽代碼,這里n1string1的字符串長度, n2string2的長度:

void *Pthrd_Substring(void *thrdptr)
{
    int i,j,k;
    int count;
    int total = 0;

    for (i = thrdptr; i <= (n1-n2); i++){       
        count=0;
        for(j = i,k = 0; k < n2; j++,k++){  /*search for the next string of size of n2*/  
            if (*(s1+j)!=*(s2+k)){
                break;
            }
            else
                count++;
            if(count==n2)    
                total++;        /*find a substring in this step*/                          
        }
    }
    partial_count = total
}

如果字符串長度為12個字符,而我只有3個線程,那么系統如何知道繼續使用3個線程來分析字符串,直到檢查完所有12個字符?

系統不知道-就像非線程編程一樣。 如果要分析每個字符,則需要編寫程序以分析每個字符。

但是,我不了解的是如何使用pthread_join。

pthread_join只是等待線程退出。 就這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM