来自多个线程的非同时内存使用&高速缓存

时间:2014-09-29 10:30:41

标签: c multithreading compiler-optimization cpu-cache

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

主线程:

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

两个线程访问相同的内存但从不同时访问(当生成的线程使用它时,主线程不会触及指针)。

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

2 个答案:

答案 0 :(得分:0)

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

该机制称为缓存一致性。即使两个线程都在具有不同高速缓存的不同核心上运行,高速缓存也会在核心之间正确无效。

当两个线程同时访问内存时,唯一可能出现的问题。您似乎从问题中通过使用"管道"来避免这个问题,我不熟悉管道,但这通常使用名为"互斥体"。的API对象来完成。 / p>

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

答案 1 :(得分:0)

在实践中,这将适用于您可能运行此代码的大多数体系结构。如果您希望符合标准,请阅读:http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_11

这表示除非您调用其中一个pthread锁定函数和其他一些函数,否则无法保证内存可以同步。您无法保证您正在运行的体系结构是缓存一致的,即使(几乎?)现代的一切都是如此。