【发布时间】:2015-12-06 02:20:52
【问题描述】:
这本书说我们需要消除全局或静态数据以保证线程安全。我认为线程安全意味着程序中没有竞争条件。 但是,在以下示例中,它将本地名副其实的“Point pt_ptr”从非指针类型更改为指针类型“Point *pt_ptr”,以防止竞争条件。我注意到他使用“malloc”,这意味着他将在堆中创建一些东西。堆中的东西由所有线程共享......因为它创建了共享的东西,它可以防止数据竞争但它会是线程不安全的吗?
int main(void) {
pthread_t tids[NUM_THREADS];
int i;
Point *pt_ptr;
for (i= 0; i < NUM_THREADS; i++) {
pt_ptr= malloc(sizeof(*pt_ptr));
pt_ptr->x= i;
pt_ptr->y= 3 * i + 2;
pthread_create(&tids[i], NULL, print_point, pt_ptr);
}
【问题讨论】:
-
所以,是的,内存是共享的,所有线程都可以看到。然而,重要的部分是,如果该数据实际上是由多个线程访问的。如果不是 - 没有问题,如果您确实有多个线程访问数据,则可能有问题。所以你需要告诉我们更多。您的“由于它创建了共享的东西,因此可以防止数据竞争”似乎也很错误。
-
全局变量简称为共享内存,但在这种情况下pt_ptr是不共享的,它作为新的私有内存分配给每个线程。
标签: c multithreading thread-safety