Спящие функции спят все потоки или только тот, кто их вызывает?

Я программирую с помощью pthread в Linux (Centos)? Я хочу, чтобы потоки ненадолго заснули, чтобы чего-то дождаться. Я пытаюсь использовать sleep(), nanosleep() или usleep(), или, может быть, что-то может это сделать. Я хочу спросить: спят ли функции сна все потоки или только тот, кто их вызывает? Любые советы или ссылки будут оценены.

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

Моя тестовая программа:

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

person Nick Dong    schedule 11.08.2012    source источник
comment
@ Кирил, давай проверим историю его вопросов. и это один вкладыш для ответа   -  person bestsss    schedule 11.08.2012
comment
Я имел в виду работу, а не предупреждение. @bestsss - что проверить? Я ничего не сказал по этому вопросу, я даже проголосовал.   -  person Kiril Kirov    schedule 11.08.2012
comment
Почему ты вообще хочешь назвать сон?   -  person Peter Ritchie    schedule 11.08.2012


Ответы (2)


Стандарт гласит:

Функция sleep() должна приостанавливать выполнение вызывающего потока до тех пор, пока ....

С linux все так же ясно:

sleep() переводит вызывающий поток в спящий режим до тех пор, пока...

Однако есть несколько ошибочных ссылок, которые утверждают обратное. linux.die.net, используемый для состояния sleep, заставляет процесс ждать.

person cnicutar    schedule 11.08.2012
comment
Я обнаружил, что в системе Red Hat Enterprise Linux Workstation версии 6.6 есть справочная страница для сна (3), которая гласит, что sleep() переводит вызывающий процесс в спящий режим до тех пор, пока... так что, возможно, исходные справочные страницы были обновлены. - person bgoodr; 09.10.2015

Просто поток, который вызывает функцию.

person jalf    schedule 11.08.2012
comment
Вы когда-нибудь проверяли это? В моей тестовой программе кажется, что основной поток спит. - person Nick Dong; 11.08.2012
comment
Да, я проверил это. Я также прочитал документацию по функциям. - person jalf; 11.08.2012
comment
@jalf на 100% прав. Если вызов Sleep() переводит основной поток в спящий режим, то основной поток вызывает его напрямую или ожидает какого-либо другого сигнала, который предоставляется спящим потоком только после перехода в спящий режим. - person Martin James; 11.08.2012
comment
Не могли бы вы разместить здесь свою тестовую программу? Я публикую свой выше, но я путаюсь с результатом. - person Nick Dong; 12.08.2012