我有一个主线程,它维护一些指向某些数据的指针。在某些时候,它会生成一个新线程并将其中一个指针传递给它。在那之后它不使用该指针。该线程完成其工作(可能修改指向的数据)并使用管道告诉主线程它可以再次使用该指针。
主线程:
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]的修改(由于缓存)。这可能会发生,如果是的话,确保主线程看到修改的最佳方法是什么?
答案 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锁定函数和其他一些函数,否则无法保证内存可以同步。您无法保证您正在运行的体系结构是缓存一致的,即使(几乎?)现代的一切都是如此。