Статьи Галерея Форум Чат Файлы HowTo Ссылки Поиск
Текущее время: 21 сен 2019, 17:11




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Канал между потоками
СообщениеДобавлено: 27 май 2006, 16:57 
Заглянувший

У нас с: 27.05.2006
Сообщения: 1
Мне нужно организовать безымянный канал между двумя потоками, первый поток должен писать в канал, второй - читать из него. Делаю следующим образом:

#include <stdlib>
#include <stdio>
#include <unistd>
#include <pthread>

static pthread_mutex_t mutex;

void* thread1_f(void* arg)
{
close(fds[0]);
int a = 2000;
pthread_mutex_lock(&mutex);
write(fds[1], &a, sizeof(int));
pthread_mutex_unlock(&mutex);
sleep(1);
close(fds[1]);

return NULL;
}

void* thread2_f(void* arg)
{
close(fds[1]);
int a;
pthread_mutex_lock(&mutex);
read(fds[0], &a, sizeof(int));
pthread_mutex_unlock(&mutex);
printf("%d\n", a);
close(fds[0]);

return NULL;
}


int main()
{
int fds[2];
pipe(fds);

pthread_mutex_init(&mutex, NULL);

pthread_t thread1_id;
pthread_t thread2_id;

pthread_create(&thread1_id, NULL, &thread1_f, &fds);
pthread_create(&thread2_id, NULL, &thread2_f, &fds);

pthread_join(thread1_id, NULL);
pthread_join(thread2_id, NULL);

pthread_mutex_destroy(&mutex);

return 0;
}


Но во втором потоке функция read возвращает ошибку EBADF.
Подскажите, пожалуйста, где и что я сделал неправильно?


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 28 май 2006, 03:02 
Неотъемлемая часть форума
Аватара пользователя

У нас с: 08.03.2004
Сообщения: 338
Немного странно, что переменная fds не глобальная. Как Ваши потоки к ней обращаются?

Уместно внести такое изменение в функции потоков, если Вы не хотите fds глобальной переменной:
Код:
void* thread1_f (arg)

      void* arg;
{
      int* fds = arg;

      /* close (fds [0]); */
      /* закомментировано мною - объяснение см. ниже */
      int a = 2000;
      pthread_mutex_lock (&mutex);
      write(fds [1], &a, sizeof (int));
      pthread_mutex_unlock (&mutex);
      sleep (1);
      /* close (fds [1]); */

     return NULL;
}


Далее, учитывая то, что это не полноценные процессы (потоки) то когда первая функция-поток закрывает канал для чтения - то она закрывает его в рамках всего процесса - само собой, это действует и для потоков, порождённых процессом (в случае с fork()'d процессов такой ситуации не наблюдается ;-) - за объяснениями см. man fork). Второй поток ничего не сможет прочитать по этой причине. Правда я не совсем понимаю, откуда у Вас нарисовалось EBADF, там где должен быть EPIPE... Короче, close (fds [0]), close (fd [1]) безопаснее делать в main ().

_________________
Ну какая работа со строками может быть в языке, название которого является не строкой, а символом? (c) Sergue E. Leontiev


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
[ All resources are available under GNU GPL ] [ Support ] [ Hosted by DataHata | MyCloud.by ] [ Powered by phpBB® Forum Software © phpBB Group ]

LVEE Winter LVEE Rambler's Top100