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

C 线程安全-使二叉搜索树线程安全,c,multithreading,thread-safety,posix,C,Multithreading,Thread Safety,Posix,我对C语言编程和线程都是相当陌生的 我正在为二进制搜索树创建函数,如插入、搜索和删除。但是我被指定使这些函数线程安全 所以我的问题是如何使这些函数线程安全,我需要做什么?还有关于线程的一般建议吗 举个例子:我已经开始使用一个搜索函数,但是如何使该线程安全呢?你能做一些简单的普通事情来保证这些线程的安全吗 int search (node* root, int number) { if(root==NULL) return 0; else if(number==root

我对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);
}
int搜索(节点*根,int编号)
{
if(root==NULL)
返回0;
else if(number==根->数据)
返回1;
否则如果(数字数据)
返回搜索(根->左,编号);
其他的
返回搜索(根->右,编号);
}

我正在使用POSIX。

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

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

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

pthread_mutex_t lock;

if (pthread_mutex_init(&lock, NULL) != 0) {
    puts("Unable to create mutex!");
    return EXIT_FAILURE;
}
并在线程参数结构中将其作为指针传递

在线程内部,您可以使用
pthread\u mutex\u lock(&lock)
pthread\u mutex\u unlock(&lock)
来保护关键部分,即发生数据争用的代码部分,而不是更多,只是访问或修改共享数据的地方,对死锁要格外小心

我假设您知道如何创建和同步线程,如果不是在这里,您有一个关于如何创建和同步线程的非常详细的教程(它也接近互斥体):


互斥是最简单的并发冲突解决机制之一,因此,这可以通过使用C标准特性来实现,使您的程序具有更高的可移植性,使用前面提到的
库。

您做过任何研究吗?例如,搜索“使c代码线程安全”?您的主要选择是一个大锁,或多读/单写器锁,具体取决于预期的工作负载。@stark一个大锁?这是什么样子的?所有访问都有一个互斥锁。除非以后出现性能问题,否则不要尝试其他方法。首先是正确性,然后是性能:)哦,是的,我应该说,我相信应该使用POSIX,互斥锁在这里会是什么样子?@BarCode,在启动线程并将其作为指针传递到线程参数结构的地方声明并初始化它,在线程内部,您使用pthread_mutex_lock and unlock来保护关键部分,即发生数据争用的地方。我在回答中添加了更多信息。作为一个小细节,C11标准中定义了一些多线程同步机制(
mtx\u t
mtx\u init()
mtx\u lock
,…),其用法与posix非常类似。如果编译器没有实现它们,posix、windows等上会存在非常薄的包装器库,如果值得的话,会使代码更易于移植。@eugenioperez这是一个很好的建议。