2013-09-09 3 views
4

Я относительно новичок в резьбах и вилках. Поэтому, чтобы понять их немного лучше, я писал простые программы. Одна из маленьких программ я написал две программы: одну для печати счетчика на двух процессах, а другую с двумя потоками. Что я заметил, так это то, что вилка печатает счетчики с чересстрочной разверткой, в то время как нить отпечатывает счетчик одного потока, а затем остальные. Итак, поток не так параллелен, но ведет себя более серийно. Почему? Я делаю что-то неправильно?Резьба и вилки

Кроме того, что именно делает pthread_join? Даже когда я не выполняю pthread_join, программа работает аналогично.

Вот мой код для резьбы

void * thread1(void *a){ 
    int i =0; 
for(i=0; i<100; i++) 
    printf("Thread 1  %d\n",i); 
} 

void * thread2(void *b){ 
int i =0; 
for(i=0; i<100; i++) 
    printf("Thread 2 %d\n", i); 
} 

int main() 
{ 
pthread_t tid1,tid2; 
pthread_create(&tid1,NULL,thread1, NULL); 
pthread_create(&tid2,NULL,thread2, NULL); 
pthread_join(tid1,NULL); 
pthread_join(tid2,NULL); 
return 0; 
} 

И вот мой код вилка

int main(void) 
{ 
pid_t childPID; 
childPID = fork(); 

if(childPID >= 0) // fork was successful 
{ 
    if(childPID == 0) // child process 
    { int i; 
    for(i=0; i<100;i++) 
     printf("\n Child Process Counter : %d\n",i); 

    } 
    else //Parent process 
    { 
     int i; 
     for(i=0; i<100;i++) 
      printf("\n Parent Process Counter : %d\n",i); 
    } 
} 
else // fork failed 
{ 
    printf("\n Fork failed, quitting!!!!!!\n"); 
    return 1; 
} 

return 0; 
} 

EDIT: Как я могу сделать резьбовую программа ведет себя больше как программы вилки? то есть счетчик печатает переплетение.

ответ

0

Прежде всего, fork создает второй процесс, создавая поток, создавая «диспетчерскую единицу работы» в рамках одного и того же процесса.

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

Возможно, вы можете, искусственно, получить выход из потоков, чередующихся, вызывая сон для разных времен из каждого потока. То есть, создайте поток A (введите его, чтобы вывести одну строку, а затем запустите на 100), затем создайте поток B (введите код, чтобы вывести одну строку, а затем спать на 50 и т. Д.)

Я понимаю, что хочу посмотреть, как потоки могут работать параллельно, подобно процессам. Но является ли это реальным требованием или просто запросом «зоопарка»?

1

Вы едете по плохой дороге здесь. Урок, который вы должны изучать, - не пытаться подумать о планировщике ОС. Независимо от того, что вы делаете - графики обработки, приоритеты или все, что вы поворачиваете, вы не можете сделать это надежно.

Вы нашли свой путь в обнаружении необходимости механизмов синхронизации - мьютексов, семафоров, переменных условий, барьеров потоков и т. Д. То, что вы хотите сделать, это именно то, почему они существуют и что вы должны использовать для достижения своих целей.

В последнем вопросе pthread_join восстанавливает некоторые ресурсы из мертвых, присоединяемых (то есть отключенных) потоков и позволяет вам проверять любую возвращаемую переменную из истекшего потока. В вашей программе они в основном служат блокирующим механизмом. То есть main будет блокировать эти вызовы до тех пор, пока не истекут потоки. Без pthread_joins ваш main закончится, и процесс исчезнет, ​​включая созданные вами потоки. Если вы не хотите присоединяться к потокам и ничего не используете в main, используйте pthread_exit в main, так как это позволит main выйти, а потоки продолжить обработку.