The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Канал между потоками"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Канал между потоками"  
Сообщение от Firix on 27-Май-06, 16:46 
Мне нужно организовать безымянный канал между двумя потоками, первый поток должен писать в канал, второй - читать из него. Делаю следующим образом:

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

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.
Подскажите, пожалуйста, где и что я сделал неправильно?

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Канал между потоками"  
Сообщение от gyn61 (??) on 27-Май-06, 22:12 
close уберите. При создании потоков (в отличие от процессов) файловые дискрипторы не дублируются (они общие для потоков).

P.S. И приводите текст программы в компилируемом виде. Там не хватает

  int *fds = (int *) arg;

в начале функций.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру