我需要设计一个系统,其中有两个线程T1和T2,其中T1提交结果,T2读取结果。如何共享和访问两个线程之间的链接列表
什么是定义可用于设计此类系统的数据结构的最有效方法?没有可以在线程间访问的共享内存,并且在复制结果的情况下会限制memcpy的使用。
结果结构被定义为预先
typedef struct
{
UINT32 ot_id;
BOOLEAN result;
} RESULT;
感谢。
我需要设计一个系统,其中有两个线程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;
}
谢谢凯米。这很有帮助。我尝试将结果排入线程1的全局分配链表中,但是当我尝试从线程2中取消结果时,我正面临分段错误。 – user3555115
@ user3555115:嗨!你可以在[PasteBin](http://www.pastebin.com/)上发布你的全部源代码或者类似的东西来分析你的代码吗?有很多事情可能是错误的。 – 3442
> 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.
(便携式)C定义没有办法做到这一点。你在Windows,GNU/Linux或Unix,还是更奇特的东西? – 3442
你的问题有点困惑。数据结构设计和线程之间共享数据的机制是正交的。而你的意思是“没有可以在线程之间访问的共享内存”?根据定义,内存在同一进程的所有线程之间共享。 – kaylum
@kaylum:我认为*他的意思是他的*任务*不允许他为他的目的利用共享内存。 – 3442