LINUX.ORG.RU

нити


0

0

деньвечерночь добрые, прошу помощи с нитями) вопрос после кода..

//////// кот
void *t2(void*)
{
  for(int i=0;i<5;i++) printf("2");
  return(0);
}

void *t1(void*)
{
  for(int i=0;i<3;i++) printf("1");
  return(0);
}

int main(int argc, char *argv[])
{
  pthread_t tid1, tid2;

  if(pthread_create(&tid2, NULL, t2, NULL))
  {
    pthread_detach(tid2);
    return(1);
  }
  if(pthread_create(&tid1, NULL, t1, NULL))
  {
    pthread_detach(tid1);
    return(1);
  }

  pthread_exit(NULL);
  return(0);
}
//////// кот

вывод - "2222111". внимание вопрос, что нужно изменить или в какую сторону почитать чтобы вывод стал "22121212"? пасип, небете ногами





anonymous

ах да, и мутексы пробовал, наверно плохо пробовал?

anonymous
()

sleep поставь в цикле миллисекунд на 100

Legioner ★★★★★
()

семафоры

anonymous
()

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

kpanic ★★
()

Почитать, например, в сторону Таненбаума "Современные операционные системы". Только не для того, чтобы вывод стал "22121212", а для осознания, почему он не такой.

Kpoxman ★★
()
Ответ на: комментарий от Kpoxman

слипы ставить в моем случае зло. семафоры это опять же "из разряда" мутектосов (всмысле может мутексы тогда довести до ума?), но посмотрю. про буферизацию немного непонял, сперва все с одного потока собирается и выводится потом с другого? ну вывод у меня условно, там другие операции, так просто нагляднее (это уже другое дело так?) почитаю ;)

anonymous
()

Если подходить к ответу формально. тебе нужно использовать condition variable'ы (man pthread_cond_init).

Но хотелось бы знать, как звучит _настоящий_ вопрос? Что ты пытаешься сделать?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

это невоенная тайна)) я сканер портов ковыряю. одной ниткой посылаются многомного пакеты. вместо того чтобы ждать какое-то время (RTT) придет ответ или нет, тупо второй ниткой отлавливаю и смотрю все приходящие пакеты. там где printf("2") - это сокет на ответ-пакет проверяет, где 1 - отсылает новый. и получается что программка или сперва все пакеты отошлет и начнет ждать ответы - ессесьно они пройдут мимо гораздо раньше и ничего она недождется.. или наоборот ждет ждет ждет и так никогда и неотошлет ниодного пакета. вопщем синхронизированить нужно, послал проверил, послал, проверил.. вот пока не полуется (

anonymous
()
Ответ на: комментарий от anonymous

> вопщем синхронизированить нужно,

Исходя из того, что я знаю о сетевом стеке, там пакеты буферизуются, так что хоть что-то приемная нить должна поймать в любом случае,

ИМХО, проще сделать ожидающей нити приоритет выше, и посмотреть, что получится.

> послал проверил, послал, проверил.. вот пока не полуется (

Если очень уж хочется сделать так, то сделай мутекс и 2 condvar (разрешение принимать и разрешение посылать), Не забудь тайм-ауты поставить для отслеживания максимального времени жизни пакетов, чтобы не ждать их прихода вечно.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

>вместо того чтобы ждать какое-то время (RTT) придет ответ или нет,
>тупо второй ниткой отлавливаю и смотрю все приходящие пакеты.
тупо использовать select()/pselect() с заданным таймаутом нельзя?
к тому же не придется отлавливать _все_ приходящие пакеты.

или я не в теме? :)

goodwin ★★
()
Ответ на: комментарий от MKuznetsov

> pthread_yield()/sched_yield()

Это делать бессмысленно на более-менее новых ядрах.

tailgunner ★★★★★
()

вопрос кстати мутный-мутный

cvv ★★★★★
()
Ответ на: комментарий от anonymous

Работайте с неблокирующимися сокетами в один поток через select/poll.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.