我需要设计一个系统,其中有两个线程 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/