【问题标题】:Thread Safety - Making Binary Search Tree thread safe线程安全 - 使二叉搜索树线程安全
【发布时间】:2021-07-12 05:49:02
【问题描述】:

我对 C 和线程编程还很陌生。

我正在为二叉搜索树创建函数,例如插入、搜索和删除。但我被指定让这些函数线程安全。

所以我的问题是如何使这些函数线程安全,我需要做什么?以及关于线程的一般建议?

举个例子:我已经开始使用搜索功能,但是您如何确保该线程安全?您可以做一些简单的常见事情来使这些线程安全吗?

int search (node* root, int number)
{
    if(root==NULL)
      return 0;
    else if(number==root->data)
      return 1;
    else if(number<=root->data)
      return search(root->left,number);
    else 
      return search(root->right,number);
}

我正在使用 POSIX。

【问题讨论】:

  • 你做过研究吗?比如搜索“make c code thread safe”?
  • 您的主要选择是一个大锁,或多读/单写锁,具体取决于预期的工作负载。
  • @stark 一把大锁?这会是什么样子?
  • 一个围绕所有访问的互斥锁。除非您以后遇到性能问题,否则不要费心尝试其他任何事情。先正确,后性能:)

标签: c multithreading thread-safety posix


【解决方案1】:

有几种方法可以使您的程序线程安全,尽管 C 标准中的 thread library exists 用于线程同步和简单的互斥机制,但更复杂的功能通常依赖于操作系统及其库、Win API、POSIX等。

您应该从一个简单的互斥锁开始。在您的特定情况下,考虑所有因素可能是最好的方法。

使用 POSIX,您声明并初始化您启动和同步线程的互斥锁:

pthread_mutex_t lock;

if (pthread_mutex_init(&lock, NULL) != 0) {
    puts("Unable to create mutex!");
    return EXIT_FAILURE;
}

并将其作为指针传递给线程参数结构。

在您使用pthread_mutex_lock(&amp;lock)pthread_mutex_unlock(&amp;lock) 保护临界区的线程内,发生数据竞争的代码部分,而不是更多less,访问或修改共享数据的地方,对死锁要格外小心。

我假设您知道如何创建和同步线程,如果不在这里,您有一个非常详尽的教程来说明如何做到这一点(它也接近互斥锁):

https://www.cs.cmu.edu/afs/cs/academic/class/15492-f07/www/pthreads.html

互斥是最简单的并发冲突解决机制之一,正如eugenioperez very accurately pointed out,这可以通过使用前面提到的&lt;threads.h&gt; 库为您的程序提供更多可移植性的C 标准功能来实现。

【讨论】:

  • 哦,是的,应该说,我认为应该使用 POSIX,Mutex 在这里看起来如何?
  • @BarCode,你声明它并在你启动线程的地方初始化它,并将它作为指针传递给线程参数结构,在线程内部你使用 pthread_mutex_lock 和 unlock 来保护临界区, ie 发生数据竞争的地方。我在答案中添加了更多信息。
  • 作为一个小吹牛,在中的C11标准中定义了一些多线程同步机制(mtx_tmtx_init()mtx_lock,...)与一个非常相似的用于posix的。如果编译器没有实现它们,那么在 posix、windows 等上存在非常薄的包装库,如果值得的话,这会使代码更具可移植性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 2014-01-23
  • 2011-03-30
  • 1970-01-01
相关资源
最近更新 更多