2012-08-11 3 views
7

Programuję z pthread na linuxie (Centos)? Chcę wątki snu przez krótki czas, aby czekać na coś. Próbuję użyć sleep(), nanosleep() lub usleep() lub może coś może to zrobić. Chcę zapytać, czy: Czy funkcje snu przesypiają wszystkie wątki, czy tylko tego, który je nazywa? Wszelkie porady i referencje byłyby doceniane.Czy funkcje snu przesypiają wszystkie wątki lub tylko tego, który je wywołuje?

void *start_routine() { 
    /* I just call sleep functions here */ 
    sleep (1); /* sleep all threads or just the one who call it? 
        what about nanosleep(), usleep(), actually I 
        want the threads who call sleep function can 
        sleep with micro-seconds or mili-seconds. 
       */ 
    ... 
} 

int main (int argc, char **argv) { 
    /* I just create threads here */ 
    pthread_create (... ...); 
    ... 
    return 0; 
} 

Mój program testowy:

#define _GNU_SOURCE 
#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sched.h> 
#include <unistd.h> 

void *start_routine (void *j) { 

    unsigned long sum; 
    int i; 
    int jj; 
    jj = (int)j; 
    do { 
     sum = 1; 
     for (i=0; i<10000000; i++) { 
      sum = sum * (sum+i); 
     } 
     if (jj == 0) { 
      printf ("\033[22;33m[jj%d.%ld]\t", jj, sum); 
      sleep(1);   
     } 
     else { 
      printf ("\033[22;34m[jj%d.%ld]\t", jj, sum); 
     } 

    }while (1); 

    pthread_exit((void *)0); 
} 
int main(int argc, char *argv[]) 
{ 
    cpu_set_t cpuset; 
    pthread_t thread[2]; 
    int i; 
    i = 0; 
    CPU_ZERO(&cpuset); 
    CPU_SET(i, &cpuset); 

    pthread_create (&thread[0], NULL, start_routine, (void *)i); 
    pthread_setaffinity_np(thread[0], sizeof(cpu_set_t), &cpuset); 
    i = 1; 
    CPU_ZERO(&cpuset); 
    CPU_SET(i, &cpuset); 
    pthread_create (&thread[1], NULL, start_routine, (void *)i); 
    pthread_setaffinity_np(thread[1], sizeof(cpu_set_t), &cpuset); 
    pthread_exit (NULL); 
} 
+0

tylko osoba dzwoniąca – bestsss

+1

@Kiril, chodź, sprawdź historię swojego pytania. i jest to jedna linijka dla odpowiedzi – bestsss

+0

Miałem na myśli "pracę", a nie "ostrzec". @ Bestsss - co sprawdzić? Nie powiedziałem nic o tym pytaniu, nawet przegłosowałem. –

Odpowiedz

9

The standard czary go:

Sleep() funkcja powoduje wywołującego wątku aby być zawieszone wykonanie aż ....

linux jeden jest tak samo jasne :

sprawia, że ​​wezwanie wątku spać do ...

Istnieje jednak kilka błędnych odniesień, które stanowią inaczej. linux.die.net używał do stwierdzenia, że ​​sleep oczekuje na proces.

+3

, ale funkcja uśpienia() wydaje się powodować główny wątek snu –

+1

@NickDong Tworzy ** wątek wywołujący ** sleep. – cnicutar

+0

Dzięki temu spróbuję jeszcze raz. –

3

Wystarczy nić, która wywołuje funkcję.

+0

Czy kiedykolwiek testowałeś to? W moim programie testowym wydaje się, że główny wątek jest uśpiony. –

+0

Tak, przetestowałem to. Czytałem również dokumentację funkcji. – jalf

+0

@jalf ma 100% poprawności. Jeśli wywołanie trybu uśpienia powoduje, że główny wątek jest uśpiony, główny wątek wywołuje go bezpośrednio lub czeka na inny sygnał, który jest dostarczany tylko przez śpiącą nitkę po snu. –

Powiązane problemy