(Этот ответ ДЕЙСТВИТЕЛЬНО ПОКА ВЫ НА 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;
}
(Portable) C не определяет способ сделать это. Вы в Windows, GNU/Linux или Unix, или что-то более экзотическое? – 3442
Ваш вопрос немного смущен. Конструкция структуры данных и механизм совместного использования этих данных между потоками являются ортогональными. И что вы подразумеваете под «Нет общей памяти, к которой можно получить доступ между потоками»? По определению память распределяется между всеми потоками одного и того же процесса. – kaylum
@kaylum: Я * думаю * он означает, что его * присваивание * не позволяет ему использовать общую память для своих целей. – 3442