我有一个主线程维护一些指向某些数据的指针。在某个时候,它会产生一个新的线程并将其中的一个指针传递给它。在那之后它不使用那个指针。线程完成其工作(可能会修改指向的数据)并使用管道告诉主线程它可以再次使用该指针。从多线程和高速缓存中使用非同时内存
主线:
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;
}
两个线程同时访问相同的内存,但从来没有在同一时间(主线程不接触指针时产生的线程使用它)。
我担心主线程可能看不到由处理程序完成的连接修改(由于缓存)。这是否会发生,如果是的话,确保主线程看到修改的最佳方法是什么?
这种线程间通信(即传递来自某个池的指针)非常普遍且绝对正常,至少在英特尔硬件上是这样。这通常是通过线程中的循环来实现的,并阻塞实际通信的队列,并且也用于存储池中的指针,但是你对我做的事情看起来还是可以的(即使产生了可避免的连续线程创建)。 – 2014-09-29 10:43:06