簡體   English   中英

將char [N]作為c中的線程參數傳遞?

[英]Passing char[N] as thread argument in c?

這是我的代碼:

void *PrintLine(void *line)
{
    printf("Line: #%s\n", (char *)line);
    pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
    char line[80];
    while(fgets(line,sizeof(line),fp))
    {
        pthread_create(&threads[rt], NULL, PrintLine, (void*)line);
    }
    fclose(fp);
}

請不要告訴我,僅運行線程以打印文件行是沒有意義的,我刪除了很多代碼,因此更易於閱讀和理解我的問題。

如您所料,此代碼不起作用,應該如何處理才能在線程內打印/使用“行”?

您正在將指向line的指針傳遞給新創建的線程,當您的線程四處使用line ,也許fgets向其中寫入了其他內容。 或者,也許是在線程訪問它時正在寫一些東西。

您可以傳遞已讀行的副本,在線程中完成對它的存儲后,請記住對其進行free()

char *copy_of_line = strdup(line);
if(copy_of_line)
  pthread_create(&threads[rt], NULL, PrintLine, copy_of_line);

您需要在main線程中使用pthread_join(3)來等待生成的每個線程的完成。 否則,主線程可能會在其他線程有機會進行打印之前結束該過程 (並確保您將生成的線程指向的堆棧內存仍在作用域內)。

編輯:

然后發布“真實”代碼,或至少發布“有效”代碼。 我們不是讀者的介意。

另一個明顯的錯誤是主線程會覆蓋其他線程應該打印的緩沖區。 無法保證該緩沖區中的某個字符串不是以零結尾的。 在將其交給其他線程之前,您確實確實需要在主線程中進行復制

兩個直接的明顯問題:

  • 您只有line實例(考慮一下)
  • 無法保證printf是線程安全的

您的問題是所有線程都使用相同的行緩沖區,因此在打印另一行之前可能會讀取新行。

暫無
暫無

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

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