2015-11-06 2 views
0

Мне нужно создать систему, в которой есть две нити T1 и T2, где T1 отправляет результаты, а T2 читает результаты.Как поделиться и получить доступ к связанному списку между двумя потоками

Каков наиболее эффективный способ определения структуры данных, который можно использовать для проектирования такой системы? Нет общей памяти, к которой можно получить доступ между потоками, и существует ограничение использования memcpy в случае, если мы скопируем результат.

Структура результат определяется как

typedef struct 
{ 
    UINT32 ot_id; 
    BOOLEAN result; 

} RESULT; 

спасибо заранее.

+0

(Portable) C не определяет способ сделать это. Вы в Windows, GNU/Linux или Unix, или что-то более экзотическое? – 3442

+1

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

+0

@kaylum: Я * думаю * он означает, что его * присваивание * не позволяет ему использовать общую память для своих целей. – 3442

ответ

1

(Этот ответ ДЕЙСТВИТЕЛЬНО ПОКА ВЫ НА UNIX/UNIX-подобной платформе!)

Хотя по определению существование потоков подразумевает разделяемой памяти, вы можете пойти извращенец путь и вместо этого используйте трубы.

Функция pipe() заявлена ​​в <unistd.h>. Он принимает параметр int[2] и возвращает код ошибки int (0 - это успех, отказ в противном случае). В случае успеха функция создает два новых дескриптора файла, один для чтения и другой для записи. Всякий раз, когда вы пишете в дескрипторе файла только для записи, эти данные поступают в дескриптор файла только для чтения! Этот механизм известен как труба . Если вы попытаетесь прочитать в файловом дескрипторе только для чтения, но данных по-прежнему нет, функция read() будет просто блокировать (если не указано иначе с помощью fcntl()).

Для любых int fd[2], pipe(fd) устанавливает fd[0] на конец считывания и fd[1] на конец записи.

Теперь вы можете позвонить pipe перед тем, как развернуть второй поток, и передать fd[0] в качестве аргумента, чтобы он мог читать данные! Давайте посмотрим пример (примечание, не проверяянет ошибок!) ...

#include <unistd.h> 

typedef struct { 
    UINT32 ot_id; 
    BOOLEAN result; 
} RESULT; 

void secondThread(int readDescriptor) { 
    RESULT result; 
    read(readDescriptor, &result, sizeof(RESULT)); 

    // Do something with that... 

    close(readDescriptor); 
} 

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

    spawnTheSecondHolyThread(secondThread, fd[0]); 

    RESULT result; 

    // Calculate the result... 

    write(fd[1], &result, sizeof(result)); 
    close(fd[1]); 

    joinTheSecondThread(); 
    return 0; 
} 
+0

Спасибо Кэми. Это полезно. Я попытался отобразить результаты в глобально распределенный связанный список из Thread 1, но когда я попытался разбить результаты из Thread 2, я столкнулся с Segmentation Faults. – user3555115

+0

@ user3555115: Привет! Можете ли вы опубликовать все свои источники в [PasteBin] (http://www.pastebin.com/) или что-то вроде того, что я могу проанализировать ваш код? Есть много вещей, которые могут быть ошибочными в этом. – 3442

0
> Use queue. 
> 1. create the queue and call the method that will produce(submit) data to the queue. 
> 2. create a new thread that will read the data from the queue. 
> 3. use mutex or any else mechanism to protect the queue heads. Else you can go lock free queue implementation. 
> 
> Let me know if you need any code. 
Смежные вопросы