2016-01-14 24 views
2

我想了解pthreads,並且正在編譯我在網上找到的程序。瞭解pthread的難點

Here is a simple one

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#define NUM_THREADS 5 

void *PrintHello(void *threadid) 
{ 
    long tid; 
    tid = (long)threadid; 
    printf("Hello World! It's me, thread #%ld!\n", tid); 
    pthread_exit(NULL); 
} 

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

    /* Last thing that main() should do */ 
    pthread_exit(NULL); 
} 

所以我無法理解PrintHello函數的語法。

1)「* PrintHello」函數名稱就像o指針(因爲星號)?

2)函數的參數是一個沒有類型的指針嗎?所以......甚至不是指針?

3)我們怎樣才能將變量的虛空類型變成長整型?

我們無法構建更簡單的函數並將其傳遞到線程中嗎?

4)最後,在pthread函數中,(void *)t參數是什麼意思? :O

非常感謝你們!

+2

你確實是知道指針如何申報?你*知道泛型指針'void *'?現在再看一下'PrintHello'函數聲明。如果你*不知道通用指針,現在是時候去你最喜歡的搜索引擎,並做一些搜索。 –

回答

3

1)「* PrintHello」函數名稱就像一個指針(因爲星號符號的 )?

這是函數,返回指向void的指針。即void *

2)該函數的參數是一個沒有類型的指針?所以...甚至不是一個 指針?

這是正確的。線程函數確實是一個帶空指針。

3)我們如何將一個void類型的變量投入長時間?

這是從指針類型到整數類型的轉換。這種轉換是實現定義的,並且可能是未定義的這對今天的大多數實現都有效,但決不是完全可移植的。

4)我們無法構建一個更簡單的函數並將它傳遞給 線程嗎?

號由於pthread_create()功能特別期望的函數指針取void*參數,並返回void*。所以你不能傳遞不同的功能。

5)最後,在pthread函數中,(void *)t 參數的含義是什麼?

這是指針轉換的整數。 (3)中的相同評論適用於此。

1

在深入研究並行性之前,您應該學習一點C語言。這樣你的學習將會變得更容易: A void pointer是一個通用指針。請檢查this關於void指針的教程。

+0

你是對的,感謝你的幫助! – Skemelio

1

1:線程功能需要有一個void*返回類型爲指針void可用於指向在存儲器中的任何數據片。

2:是的,這是正確的。

3:這是從pointerint的轉換。

4:這是一個intpointer轉換。

你應該閱讀上線的一些基本教程和C.看了一些書