2011-08-09 5 views
14

작업을 가져 와서 연결된 목록 인 대기열에 넣는 디스패치 대기열에 대한 c 파일을 만들고 있습니다. 이를 위해, 나는 '일'과 함수를 작성의 매개 변수로 'PARAM'변수에 들어가는 다른 기능을해야하지만C, pthread_create 함수를 사용하여 스레드를 만드는 방법

pthread_t cThread; 
if(pthread_create(&cThread, NULL, work, param)){ 
    perror("ERROR creating thread."); 
} 

사용하여 스레드를 생성해야합니다. 내 친구는 스레드가 죽지 않도록 루프를 무한히 반복하는 작업 코드에 모든 코드를 넣어야한다고 말했습니다. 누구나 각 매개 변수가 pthread_create 함수 - 특히 workparam에 대해 설명 할 수 있습니까? 나는이 구글을 검색하지만, 튜토리얼의 대부분은 순서대로, pthread_create

+0

http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_create.html – miku

+0

그래, 읽었습니다. 나는 누군가가 나를 문장으로 설명하기를 원한다. 각 매개 변수는 무엇인가? – Leanne

답변

23

네 개의 매개 변수는 ... 개념을 이해하기 너무 어려운 :

  1. pthread_t 구조에 대한 포인터, 어떤 pthread_create 작성한 스레드에 대한 정보로 채울 것입니다.

  2. 스레드에 대한 매개 변수가있는 pthread_attr_t에 대한 포인터. 거의 대부분 NULL으로 안전하게 전달할 수 있습니다.

  3. 스레드에서 실행할 함수. 이 함수는 void *을 반환해야하고 void * 인수를 취해야합니다. (예를 들어, 같은 기능을 가진 여러 스레드를 시작하는 경우이 매개 변수를 사용하여 구분할 수 있습니다.)

  4. 스레드를 시작하려는 void *. 필요없는 경우 NULL을 전달하십시오.

16

명확히 duskwuff의 대답은 :

work 매개 변수는 함수 포인터이다. 함수는 void * 유형으로 표시되고 반환 값은 void * 인 하나의 인수를 취해야합니다.

paramwork이받는 데이터에 대한 포인터가 될 것으로 예상됩니다.

예를 들어, 두 int를 작업자에게 전달하려고한다고 가정 해 보겠습니다. 그런 다음,이 같은 것을 만들 수 있습니다

int *param = (int *)malloc(2 * sizeof(int)); 
param[0] = 123; 
param[1] = 456; 
pthread_create(&cThread, NULL, work, param); 

그런 다음 당신의 일 함수 포인터 형식을 변환하고 PARAM 데이터 잡을 수있는 구조체를 만드는 것처럼,

void *work(void * parm) { 
    int *param = (int *)parm; 
    int first_val = param[0]; 
    .... 
} 

당신은 더 복잡한 물건을 할 수 있습니다 모든 데이터를 전달해야합니다.

+6

'malloc'의 반환 값을 캐스트하지 말아라. 그 반환 값은'void *'이며 항상 모든 데이터 포인터에 할당 가능하다. 'parm'도 마찬가지입니다. –

+0

C++의 @Jens 나쁜 습관 : / –

관련 문제