2011-11-25 2 views
0
여기

내 코드입니다 :P 스레드와 C 언어

이제
static long x = 0; 
void * thread_func(void *arg){ 
while(1){ 
    printf("Thread 2 says %ld\n",++x); 
    sleep(1); 
} 
} 
int main(){ 
pthread_t tid; 
pthread_create(&tid,NULL,thread_func,NULL); 
while(x < 10) { 
    printf("Thread 1 says %ld\n",++x); 
    sleep(2); 
} 
return 0; 
} 

하여 출력한다 무엇인지,이 책은 될 것이라고 말했습니다 :

이제
OUTPUT 
Thread 1 says 1 
Thread 2 says 2 
Thread 2 says 3 
Thread 1 says 4 
Thread 2 says 5 
Thread 2 says 6 
Thread 1 says 7 
Thread 2 says 8 
Thread 2 says 9 
Thread 1 says 10 
Thread 2 says 11 
Thread 2 says 12 

는 첫 번째는 실이해야하지 않는다 pthread_create()이 main의 while 루프 앞에 있기 때문에 1이라고 말합니다. 또한 수면은 어떻게됩니까? 스레드가 잠 들어있는 것과 정확히 무슨 일이 생기며, 실행중인 스레드가 잠자기 상태 일 때 어떤 프로세스가 실행됩니까?

즉 수면 (1)과 수면 (2) (1)과 (2)는 무엇을 의미 하는가?

+0

'수면 (1)'의미가 없습니다 : 실 제 1 번, 잠자기하십시오. 운영 체제에 현재 스레드가 지쳐 있는지 알려주고 1 초 동안 낮잠을 자려고합니다. –

+1

당신은 [man 3 sleep] (http://linux.die.net/man/3/sleep)을 참조 할 수있는'sleep' 명령어에 대한 정확한 설명을 위해서. 일반적으로 사용하는 모든 라이브러리 기능에 대한 세부 정보를 찾아 보는 것이 좋습니다. [3 장 맨 페이지] (http://www.kernel.org/doc/man-pages/online/dir_section_3.html)는'pthread _...'함수와 타입에 대한 좋은 참고 자료입니다. – moooeeeep

답변

3

어떤 책을 읽고 있는지 확실하지 않지만 즉시 읽지 말아야합니다. 우선, main에 루프를 입력하기 전에 스레드가 가동되어 실행되는 것을 보장 할 수 없습니다. 전후로 시작할 수 있습니다. 두 번째로 두 개의 다른 스레드에서 변수 x에 액세스 할 때 액세스 동기화가 없으므로 어떤 값을 가질 지 보증하지 않습니다. printf을 호출하면 stdout 개체에서 동기화되고 sleep을 호출하면 스레드가 바뀌며 다시 일정을 잡는 데 많은 시간이 걸립니다. 이 예제는 유용하지 않으며 출력에 대한 가정이 잘못되었습니다. 는 pthread_create()를 기본으로하면서 루프 전에 때문에

지금 어떤 응답 ..

이제 첫번째 스레드 2이어야 없다 1 말한다. 반드시

하지 않습니다. 다른 스레드를 시작하는 데 많은 CPU주기가 필요합니다. 따라서 다른 스레드가 시작하기 전에 에 while 루프를 입력 할 가능성이 큽니다. 그러나 반드시 그런 것은 아닙니다.

방법도 여기에 수면 작동합니까?

커널에게 주어진 시간 (초) 동안 호출 스레드를 실행하지 않도록 지시합니다. 실제 수면 시간은 스케줄링과 관련된 오버 헤드로 인해 조금 더 길어질 수 있습니다. 다른 스레드는 그 영향을받지 않습니다. (물론, 다른 스레드는 더 많은 CPU 시간 등을 가질 수 있습니다. 실행중인 스레드를 인용 할 때

란 프로세스 실행?

프로세스는 아무것도 실행하지 않습니다. 프로세스 (및 스레드)를 실행하는 것은 커널의 스케줄입니다. 기본적으로 프로세스는 하나의 주 스레드로 구성되며 커널은이를 실행합니다. 더 많은 스레드를 생성하면 스케줄러는 프로세스 내에서 더 많은 스레드를 실행합니다. 하나 이상의 스레드가 대기 상태 일 때 스케줄러는 대기 상태가 아닌 스레드를 실행합니다. 동일한 주소 공간을 공유하는 프로세스로 스레드를 생각해보십시오.

+0

실행중인 스레드가 휴면 상태 일 때 어떤 프로세스가 실행됩니까? 그가 의도 한 바는 모든 스레드가 잠자고있는 경우 실행중인 스레드입니다. 스레드에 프로세서 시간이 필요하지 않으면 프로세서가 유휴 상태 여야합니다. 그런 경우에는 프로세서에 '정지 (halt)'를 호출하는 시스템 스레드가 있다고 가정하고 타이머 시간 초과 또는 다른 외부 인터럽트가 발생할 때까지 아무 것도하지 않습니다 (예 : 하드 디스크의 데이터 준비 또는 새 USB 장치 연결). 일반적인 개발자에게 중요한 점은 프로세서가 아무 것도하지 않을 때 에너지를 낭비하지 않는다는 것입니다. – LittleFunnyMan

0

프로그램에는 다중 스레드 프로그램이 가질 수없는 큰 결함이 있습니다. 나는 실제로 글로벌 varaible "x"가 그들 사이에 어떤 종류의 동기화도없이 2 개의 쓰레드에 의해 조작되도록 허용한다. 변수에 포함 된 데이터가 일관성 없게됩니다. 예기치 않은 결과가 발생합니다. 좋은 예를 들어 더 좋은 책을 참고해야합니다. 기본적으로 변수 'x'에 액세스하는 동안 잠금을 사용하는 것이 좋습니다.

위의 다른 사람들이 sleep을 지적하면 원하는 시간 (초) 동안 스레드가 커널을 실행하지 못하게됩니다. 나는 그것이 동기화의 수단으로 여기에서 사용되고 있다고 느낍니다. 그러나 변수 'x'에 대한 연산이 일관성을 가지지 않을 것이라는 보장이 없으므로 sleep은 결코 좋은 선택이 아닙니다. 잠을 자지 마십시오. 자물쇠를 사용하십시오. 쓰레드 프로그래밍을 시작하는 훌륭한 장소

http://cs.tju.edu.cn/orgs/hpclab/course/undergraduate/Ref/POSIXMultithreadProgrammingPrimer.pdf

그것의 pthread 프라이머입니다.