2012-08-11 10 views
7

Sto programmando con pthread su linux (Centos)? Voglio filare dormire un po 'di tempo per aspettare qualcosa. Sto cercando di usare sleep(), nanosleep() o usleep() o forse qualcosa può farlo. Voglio chiederlo: le funzioni del sonno dormono tutte le discussioni o solo quella che la chiama? Qualsiasi consiglio o riferimento sarebbe apprezzato.Le funzioni sleep dormono tutti i thread o solo chi lo chiama?

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; 
} 

Il mio programma di test:

#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

solo il chiamante – bestsss

+1

@Kiril, dai, controlla la sua cronologia delle domande. ed è un singolo liner per la risposta – bestsss

+0

intendevo "lavoro", non "avviso". @bestsss: cosa controllare? Non ho detto nulla su questa domanda, ho persino votato. –

risposta

9

The standard magie esso:

Il sonno() funzione deve causare thread chiamante di essere sospesa dall'esecuzione fino ....

Il linux uno è altrettanto chiaro :

sleep() rende il thread di chiamata sleep fino a ...

Ci sono tuttavia alcuni riferimenti errati che mantengono il contrario. linux.die.net utilizzato per dichiarare sleep cause il processo attendere.

+3

ma la funzione sleep() sembra rendere il thread principale sleep –

+1

@NickDong Rende ** il thread chiamante ** sleep. – cnicutar

+0

Grazie, ci riproverò. –

3

Proprio il thread che chiama la funzione.

+0

Hai mai provato per quello? Nel mio programma di test, sembra che il thread principale dorma. –

+0

Sì, l'ho provato. Ho anche letto la documentazione per le funzioni. – jalf

+0

@jalf è corretto al 100%. Se la chiamata a Sleep() sta facendo interrompere il thread principale, il thread principale lo chiama direttamente o è in attesa di qualche altro segnale fornito solo dal thread dormiente dopo il sonno. –