c - 多线程和缓存非同时使用内存

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

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

我担心主线程可能看不到处理程序对connections[i]所做的修改(由于缓存)。这种情况会发生吗?如果会发生,确保主线程看到修改的最佳方法是什么?

最佳答案

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

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

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

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

关于c - 多线程和缓存非同时使用内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26097773/

相关文章:

java - 编译器优化: will double checking a case cause removal?

c - 为什么我必须在指针上使用 free 而不是普通声明?

c - TCP 让服务器先关闭连接 让客户端先关闭连接

android - WebView 的 loadUrl 方法是否在 UI 线程上运行?

multithreading - 何时使用 Test&Set 或 Test&Test&Set?

c - 运行优化代码时缓冲区溢出

c - 我是否会面临缓冲区溢出的风险以及如何避免这种情况?

三元语句中的 C 逗号

java - Java 如何发送并行 POST 请求

c++ - 将数学计算写成变量初始化中常量表达式的值会增加计算量吗?