对 C 中的线程安全和竞争条件感到困惑

标签 c multithreading thread-safety

书上说我们需要消除全局或静态数据以实现线程安全。我认为线程安全意味着程序中没有竞争条件。 但是,在下面的示例中,它将本地名副其实的“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);
  }

最佳答案

只有在没有某种线程安全机制(例如互斥量或信号量)的情况下,多个线程试图访问同一内存空间(例如变量)时,才会是线程不安全的。它们用于提供一种阻塞机制,这样一个线程将坐下来“等待”,直到当前拥有的线程通过,此时第二个线程将能够访问/修改变量。

将它们想象成 DMV 的号码,您必须等到您的号码被调用后才能获得服务。

关于对 C 中的线程安全和竞争条件感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34113253/

相关文章:

pthread_mutex_lock() 能否在 pthread_cond_wait() 解除阻塞之前解除阻塞?

C++11 在不使用 try/catch block 的情况下安全地加入线程

multithreading - 在 Linux 2.6+ 中替换系统调用(syscalls)

java - 在线程中启动 doLayout() 怎么样?

c++ - 为什么 C++ 中的静态 thread_local 对象构造了两次?

java - 在这种情况下如何有效地使用线程?

c - Shell 重定向导致无限打印到终端

c - GCC 符号查找错误

C静态内联函数重定义规则

c++ - 使用 C++ MJPEG 流媒体服务器时缺少 boost::asio 随机 header