我需要设计一个系统,其中有两个线程T1和T2,其中T1提交结果,T2读取结果。
定义可用于设计此类系统的数据结构的最有效方法是什么?在线程之间没有可以访问的共享内存,如果我们复制结果,则会限制memcpy的使用。
结果结构定义为
typedef struct
{
UINT32 ot_id;
BOOLEAN result;
} RESULT;
提前致谢。
答案 0 :(得分: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;
}
答案 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.