如何共享和访问两个线程之间的链接列表

时间:2015-11-06 03:40:34

标签: c

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

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

结果结构定义为

typedef struct 
{
   UINT32 ot_id;
   BOOLEAN result;

} RESULT;

提前致谢。

2 个答案:

答案 0 :(得分:1)

这个答案与UNIX /类似UNIX的平台一样有效!

虽然根据定义,线程的存在意味着共享内存,但您可以采用怪异的方式并使用管道。

函数pipe()<unistd.h>中声明。它需要int[2]作为参数,并返回错误代码int0成功,否则失败)。如果成功,该函数将创建两个新的文件描述符,一个用于读取,另一个用于写入。无论何时写入只写文件描述符,该数据都会到达只读文件描述符!该机制称为管道。如果您尝试读入只读文件描述符,但数据仍然不存在,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;
}

答案 1 :(得分: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.