Язык Pthread и C - PullRequest
       6

Язык Pthread и C

0 голосов
/ 25 ноября 2011

Вот мой код:

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

Теперь не должен быть первый из них: поток 2 говорит 1, поскольку pthread_create() перед циклом while в main. И как здесь работает сон? Например, для чего конкретно спит поток, и какой процесс выполняется, когда спящий поток выполняет .?

т.е. сон (1) и сон (2), что означают 1 и 2?

Ответы [ 2 ]

3 голосов
/ 25 ноября 2011

Я не уверен, какую книгу вы читаете, но вы должны немедленно прекратить ее читать. Прежде всего, вы не можете гарантировать, что поток будет запущен и запущен до входа в цикл в main. Это может начаться до или после. Во-вторых, отсутствует синхронизация доступа при доступе к переменной x из двух разных потоков, поэтому нет гарантии, какое значение она будет иметь. Вызов printf синхронизируется с stdout объектом, а вызов sleep заменяет поток, и для его повторного планирования требуется много времени. Этот пример бесполезен, и предположения о выводе неверны.

Теперь несколько ответов ..

Теперь не должен быть первый из них Тема 2 говорит 1, так как pthread_create () перед циклом while в main.

Не обязательно. Требуется много циклов ЦП, чтобы запустить другой поток. Таким образом, наиболее вероятно, что вы введете цикл while в main до запуска этого другого потока. Но не обязательно.

Также, как здесь работает сон?

Сообщает ядру не выполнять вызывающий поток в течение заданного количества секунд. Фактическое время ожидания может быть немного больше из-за накладных расходов, связанных с планированием. На другие потоки это не влияет (да, но не напрямую, т. Е. Другие потоки могут иметь больше процессорного времени и т. Д.).

какой процесс выполняется, когда исполняющий поток спит?

Процесс никогда ничего не выполняет. Это расписание ядра, которое выполняет процессы (и потоки). По умолчанию процесс состоит из одного основного потока, и ядро ​​выполняет его. Когда вы создаете больше потоков, планировщик выполняет больше потоков внутри процесса и т. Д. Когда один или несколько потоков спят, планировщики запускают те, которые не спят. Думайте о потоках как о процессах, совместно использующих одно и то же адресное пространство - вот чем они являются.

0 голосов
/ 25 ноября 2011

Программа имеет огромный недостаток, который не может себе позволить ни одна многопоточная программа. На самом деле я позволяю манипулировать глобальным переменным «x» двумя потоками без какой-либо синхронизации между ними. это обязательно приведет к тому, что данные, содержащиеся в переменной, станут непоследовательными. Непредсказуемый вывод приведет. вам нужно обратиться к лучшей книге с хорошим примером. в основном идея заключается в использовании блокировок при доступе к переменной 'x'.

Как уже указывалось выше, sleep остановит ядро ​​от выполнения потока в течение желаемого количества секунд. Я чувствую, что он используется здесь как средство синхронизации. однако режим сна никогда не является хорошим вариантом, поскольку он не гарантирует, что операция с переменной 'x' не станет несовместимой. Не полагайтесь на сон. использовать замки. Отличное место для начала программирования потоков -

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

Это праймер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...