2015-11-06 35 views
0

我需要设计一个系统,其中有两个线程T1和T2,其中T1提交结果,T2读取结果。如何共享和访问两个线程之间的链接列表

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

结果结构被定义为预先

typedef struct 
{ 
    UINT32 ot_id; 
    BOOLEAN result; 

} RESULT; 

感谢。

+0

(便携式)C定义没有办法做到这一点。你在Windows,GNU/Linux或Unix,还是更奇特的东西? – 3442

+1

你的问题有点困惑。数据结构设计和线程之间共享数据的机制是正交的。而你的意思是“没有可以在线程之间访问的共享内存”?根据定义,内存在同一进程的所有线程之间共享。 – kaylum

+0

@kaylum:我认为*他的意思是他的*任务*不允许他为他的目的利用共享内存。 – 3442

回答

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; 
} 
+0

谢谢凯米。这很有帮助。我尝试将结果排入线程1的全局分配链表中,但是当我尝试从线程2中取消结果时,我正面临分段错误。 – user3555115

+0

@ user3555115:嗨!你可以在[PasteBin](http://www.pastebin.com/)上发布你的全部源代码或者类似的东西来分析你的代码吗?有很多事情可能是错误的。 – 3442

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. 
相关问题