顾名思义,"pthread_mutex_lock "函数必须被用来锁定某些东西。C语言的POSIX库想出了这个函数来锁定一个特定的线程,该线程可能被程序中的其他函数用作共享资源。当两个或更多的函数使用同一个线程作为其执行完成的资源时,有必要在执行时避免死锁。因此,我们将讨论Ubuntu 20.04系统中C语言POSIX库中 "pthread_mutex_lock "函数的用法。
例子1:
让我们从第一个例子开始,看看C代码中POSIX的mutex_lock()函数。我们先用Ubuntu的shell中的 "touch "指令创建了一个文件。这个新生成的文件可以在你的Linux主文件夹中找到。要在这个文件中添加代码,你必须在Ubuntu的一些编辑器中打开它,如text、nano或vim。我们在这里使用Nano编辑器来创建代码。这两个命令都在图片中列出。
我们用一些C语言头包来开始我们的C语言代码。这些头文件包包括使用标准输入输出的代码、标准库、字符串头文件和POSIX线程库。我们已经初始化了一个大小为3的POSIX线程对象 "th",即它将只使用ID创建3个线程。
之后,声明了整数类型的变量,即 "I "和count"。变量 "I "被初始化为0。这里有一个pthread_mutex_t变量来声明线程的 "锁"。尽管执行是从main()方法开始的,但我们必须先看一下Thread函数。由于 "mutex_lock "函数的存在,这个函数被称为我们代码的关键部分。在Thread函数的开始,pthread_mutex_lock函数利用锁变量,用main()函数pthread_create()方法传递的 "ID "锁定特定线程。
现在,在这个线程被解锁之前,没有其他线程可以使用这个线程。所以,它将继续进行处理。长类型变量 "I "被初始化为0,以便在 "for "循环中使用。count "变量被递增了1。count变量在print语句中被使用,以让我们知道 "Thread1 "现在已经启动。for "循环 "将在这里被初始化,以便为Thread的执行提供一个中断的时刻。之后,print语句将让我们知道线程1将被结束。
相对于pthread_mutex_unlock()函数,pthread_mutex_lock()函数被用来解除对线程1的锁定。控制权转到main()方法。main()函数继续创建Thread函数,直到计数达到3。在创建、锁定、解锁和退出3个线程后,轮到main()方法了。
main()函数被初始化为一个整数变量 "err"。这里使用 "if "语句来检查使用POSIX的 "pthread_mutex_init() "函数初始化互斥线程 "l "是否失败。如果初始化失败,它将打印出打印语句中的特定信息。while "循环在这里是为了查看条件,即 "I "小于3,它将确认 "I "的值小于3,因此,继续创建一个线程。每个线程在被调用时都会被锁定,在此之前不能创建其他线程。
如果我们在线程中得到一个错误,我们将通过使用 "strerror "方法将其转换为字符串在shell中显示该错误。pthread_join()函数被用来收回所有给线程的资源。最后,"pthread_mutex_destroy() "函数被用来销毁锁对象。我们的程序到此结束。
文件已经被编译,而且我们没有得到任何错误。在执行时,main()函数启动并创建了一个线程1。
过了一会儿,由于锁的存在,线程1完成了它的执行并结束。之后,main()函数创建了线程2,并启动了它。
在线程2完全执行后,锁已经结束,main()函数创建了最后一个线程,即第三线程。
在第三个线程完全执行后,锁被释放,控制权被交还给主方法。
例子2:
让我们再来看一个例子,看看POSIX的 "pthread_mutex_lock() "函数是如何工作的。这段代码是以相同的头文件开始的。
在头文件之后,我们创建了一个mutex锁函数。这里有三个函数。两个线程函数,一个是链接函数。线程1和线程2从main()函数接受输入,即线程对象th1和th2。两个线程函数都在调用show()方法,并在其参数中传递两个字符串。当 "show "函数启动时,它使用 "pthread_mutex_lock() "函数利用mutex锁对象来锁定自己。第一个打印语句正在接收第一个参数并显示它。然后,它休眠1秒,第二个参数的值将通过打印语句显示。在最后一行,使用 "pthread_mutex_unlock() "函数利用锁对象释放了锁。
main()函数开始时创建了两个线程对象,即th1和th2。通过 "pthread_create "函数在参数中传递th1和th2,两个线程被创建。"while "循环被用来运行,甚至一秒钟都不结束。因此,程序继续处理自己。
该代码首先在Ubuntu 20.04的 "gcc "编译器的帮助下进行了编译。
当代码被执行时,show()方法一个接一个地使用Thread1和Thread2函数调用。线程执行完毕后,程序并没有停止。因此,我们必须使用 "Ctrl+Z "快捷键强行停止执行。
为了防止你的系统做不停的处理,我们必须从main()方法的代码中删除 "while "循环。返回0的短语已经被 "while "循环所取代。
现在,这个程序已经可以被编译和执行了。因此,我们已经用 "gcc "编译器编译了这个程序。在这之后,执行已经发生了。你可以看到,在执行了两个线程后,程序已经结束。线程1工作了,show()函数在执行时锁定了自己。执行后,它释放了自己,线程2被执行。在其中调用 "show "函数并传递一些参数。show() "函数锁定了自己,直到执行完成后才释放,并且没有调用mutex_lock函数。之后,控制权被交还给main()方法,程序结束。
总结
这就是我们所能做的一切,让你了解C代码中pthread_mutex_lock函数的用法。我们尝试了两个极其不同的程序来让你理解,并对这两个例子进行了相当简短和简单的解释。我们相当乐观地认为,这篇文章对每个C语言用户来说都是很好的。