线程安全 - 使二叉搜索树线程安全

时间:2021-04-17 12:24:59

标签: c multithreading thread-safety posix

我对 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。

1 个答案:

答案 0 :(得分: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(&lock)pthread_mutex_unlock(&lock) 保护临界区的线程中,发生数据竞争的代码部分,不多不少,访问或修改共享数据的地方,要格外小心死锁。

我假设您知道如何创建和同步线程,如果不是在这里,您有一个非常详尽的教程(它还涉及互斥锁):

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

互斥是最简单的并发冲突解决机制之一,作为 eugenioperez very accurately pointed out,这可以使用 C 标准功能实现,使用上述 <threads.h> 库为您的程序提供更多可移植性。

相关问题