2014-09-29 37 views
0

我有一个主线程维护一些指向某些数据的指针。在某个时候,它会产生一个新的线程并将其中的一个指针传递给它。在那之后它不使用那个指针。线程完成其工作(可能会修改指向的数据)并使用管道告诉主线程它可以再次使用该指针。从多线程和高速缓存中使用非同时内存

主线:

struct connection *connections[4]; 
// initialize connections 
while (1) 
{ 
    // ... 

    if (...) 
    { 
     pipe(p); 
     connection->control = p[1]; 

     pthread_create(&thread_id, 0, &handler, connections[i]); 
     pthread_detach(thread_id); 

     // ... 
    } 

    // ... 

    if (pipe_data_available[i]) 
    { 
     // do something with connections[i] 
    } 

    // ... 
} 

其他线程:

void *handler(void *arg) 
{ 
    struct connection *connection = arg; 

    // do something with connection 

    write(connection->control, data, data_size); 

    return 0; 
} 

两个线程同时访问相同的内存,但从来没有在同一时间(主线程不接触指针时产生的线程使用它)。

我担心主线程可能看不到由处理程序完成的连接修改(由于缓存)。这是否会发生,如果是的话,确保主线程看到修改的最佳方法是什么?

+1

这种线程间通信(即传递来自某个池的指针)非常普遍且绝对正常,至少在英特尔硬件上是这样。这通常是通过线程中的循环来实现的,并阻塞实际通信的队列,并且也用于存储池中的指针,但是你对我做的事情看起来还是可以的(即使产生了可避免的连续线程创建)。 – 2014-09-29 10:43:06

回答

0

不,线程之间不会有任何缓存问题。这是管理的,不能发生。

该机制被称为缓存一致性。即使两个线程都在具有不同缓存的不同核心上运行,缓存在内核之间的适当无效也是如此。

当两个线程同时访问内存时出现唯一可能的问题。从你的问题看来,你通过使用“管道”来避免这个问题,我不熟悉管道,但是这更多的时候是通过称为“互斥体”的API对象完成的。

http://mortoray.com/2010/11/18/cpu-memory-why-do-i-need-a-mutex/

+1

在一般情况下这是完全错误的。缓存一致性非常明显是一个问题。 – JeremyP 2014-09-29 10:39:58

+0

是的。从经验上讲,它在英特尔硬件上运行良好。 – 2014-09-29 10:45:27

+0

我使用管道,因为我有多个线程,我可以通过poll()查看每个线程何时完成。 – martinkunev 2014-09-29 10:47:05