Вопрос по c, multithreading, pthreads, sleep, thread-sleep – Спящие функции спят все потоки или только тот, кто это вызывает?

7

Я программирую с 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);
}
Почему ты вообще хочешь спать? Peter Ritchie
только звонящий bestsss
@ Кирилл, давай проверим историю его вопросов. и это единственный вкладыш для ответа bestsss
Я имел в виду «работа», а не «предупредить». @bestsss - что проверить? Я ничего не сказал по этому вопросу, я даже проголосовал. Kiril Kirov

Ваш Ответ

1   ответ
9

Стандарт по буквам это:

The sleep() function shall cause the calling thread to be suspended from execution until ....

линукс одно так же ясно:

sleep() makes the calling thread sleep until...

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

но функция sleep (), кажется, заставляет основной поток спать Nick Dong
Спасибо, я попробую еще раз. Nick Dong
@NickDong Это делаетthe calling thread спать.
Я обнаружил, что в системе Red Hat Enterprise Linux Workstation версии 6.6 есть справочная страница для sleep (3), которая гласит: «sleep () переводит вызывающий процесс в спящий режим до ...» так что, возможно, обновленные man-страницы были обновлены.

Похожие вопросы