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