c - 如何在两个线程之间共享和访问链表

标签 c

我需要设计一个系统,其中有两个线程 T1 和 T2,其中 T1 提交结果,T2 读取结果。

定义可用于设计此类系统的数据结构的最有效方法是什么?线程之间没有可以访问的共享内存,并且在复制结果时,memcpy 的使用受到限制。

结果结构定义为

typedef struct 
{
   UINT32 ot_id;
   BOOLEAN result;

} RESULT;

提前致谢。

最佳答案

(只要您在 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;
}

关于c - 如何在两个线程之间共享和访问链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33559076/

相关文章:

C 编程基础知识 : Why can't I see the . o 使用 gcc 编译 .c 文件后的文件

c - GCC 和 Clang 之间的执行性能差距

c - 用C编写一个计算PriorityQueue中元素数量的函数

c - 写入同一列(csv 文件)C

c - 如何在静态声明期间在结构中指定灵活的数组成员大小

凯撒密码 C 语言

c - 有没有办法让 scanf 从文件中读取

c - 使用 char *、unsigned char * 和 signed char * 别名

c - 如何在 typedef struct 中使用 int 数组 (C)

c - 在 C 中操作字符串 Perl SV