更新时间:2023-11-13 22:15:10
它们实际上不是一回事。
互斥(互斥信号量)是一种将资源的使用限制为一次只能使用一个线程的方法(两个线程显然都能够运行)。当线程从pthread_mutex_lock
调用成功返回时,可以保证它是唯一持有该锁的线程。在该点之后尝试锁定该互斥锁的任何线程通常都必须等待,直到拥有它的线程将其解锁。
换句话说,拥有锁的线程是唯一能够操作受该锁保护的资源的线程(当然,假设其他线程在没有首先获取锁的情况下不能访问资源-您必须遵守规则)。
Apthread_join
则允许线程等待另一个线程退出。这通常在主线程中用来等待所有子线程退出(还有其他用途,这只是一个典型的用途)。从pthread_join
成功返回表示另一个线程不再运行。
在您所显示的代码中,两个线程同时运行,counter
增量和对printf
的调用都受到mutex1
的保护。main
末尾的pthread_join
调用将使主线程等到两个子线程退出后再继续。
顺便说一句,您应该检查pthread_mutex_lock
的返回值,因为可能失败。在这种情况下,您不想继续修改受保护的资源,因为可能会发生损坏。pthread_join
同上。
为了进行更全面的测试,***使用以下函数:
void *functionC() {
int i;
for (i = 1000; i > 0; i--) {
pthread_mutex_lock (&mutex1);
counter++;
printf ("Counter value: %d
", counter);
pthread_mutex_unlock (&mutex1);
}
}
,因为它更有可能让线程并行运行。如果没有循环,一个线程很有可能在第二个线程启动之前就退出。