pthread_join 和 pthread_mutex_lock 有什么区别?
Whats the difference between pthread_join and pthread_mutex_lock?
以下代码摘自 this site,它展示了如何使用互斥体。它实现了 pthread_join 和 pthread_mutex_lock:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *functionC();
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int counter = 0;
main()
{
int rc1, rc2;
pthread_t thread1, thread2;
/* Create independent threads each of which will execute functionC */
if( (rc1=pthread_create( &thread1, NULL, &functionC, NULL)) )
{
printf("Thread creation failed: %d\n", rc1);
}
if( (rc2=pthread_create( &thread2, NULL, &functionC, NULL)) )
{
printf("Thread creation failed: %d\n", rc2);
}
/* Wait till threads are complete before main continues. Unless we */
/* wait we run the risk of executing an exit which will terminate */
/* the process and all threads before the threads have completed. */
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
exit(EXIT_SUCCESS);
}
void *functionC()
{
pthread_mutex_lock( &mutex1 );
counter++;
printf("Counter value: %d\n",counter);
pthread_mutex_unlock( &mutex1 );
}
我运行上面给出的代码,它产生了以下结果:
计数器值:1
计数器值:2
但是在第二个 运行 中我删除了 "pthread_mutex_lock( &mutex1 );" 和 "pthread_mutex_unlock( &mutex1 );" 。我编译并 运行 代码,它再次产生相同的结果。
现在让我困惑的是为什么在上面的代码中使用互斥锁,而没有它也可以完成同样的事情(使用pthread_join)?如果 pthread_join 阻止另一个线程 运行ning 直到第一个线程完成,那么我认为它已经阻止了另一个线程访问计数器值。 pthread_mutex_lock 的目的是什么?
连接阻止起始线程 运行ning(并因此终止进程)直到 thread1 和 thread2 完成。它不提供 thread1 和 thread2 之间的任何同步。互斥锁阻止线程 1 在线程 2 修改计数器时读取计数器,反之亦然。
没有互斥锁,最明显的错误可能是线程 1 和线程 2 运行 完全同步。他们每个人从计数器中读取零,每个人加一,每个输出 "Counter value: 1".
以下代码摘自 this site,它展示了如何使用互斥体。它实现了 pthread_join 和 pthread_mutex_lock:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *functionC();
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int counter = 0;
main()
{
int rc1, rc2;
pthread_t thread1, thread2;
/* Create independent threads each of which will execute functionC */
if( (rc1=pthread_create( &thread1, NULL, &functionC, NULL)) )
{
printf("Thread creation failed: %d\n", rc1);
}
if( (rc2=pthread_create( &thread2, NULL, &functionC, NULL)) )
{
printf("Thread creation failed: %d\n", rc2);
}
/* Wait till threads are complete before main continues. Unless we */
/* wait we run the risk of executing an exit which will terminate */
/* the process and all threads before the threads have completed. */
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
exit(EXIT_SUCCESS);
}
void *functionC()
{
pthread_mutex_lock( &mutex1 );
counter++;
printf("Counter value: %d\n",counter);
pthread_mutex_unlock( &mutex1 );
}
我运行上面给出的代码,它产生了以下结果:
计数器值:1
计数器值:2
但是在第二个 运行 中我删除了 "pthread_mutex_lock( &mutex1 );" 和 "pthread_mutex_unlock( &mutex1 );" 。我编译并 运行 代码,它再次产生相同的结果。
现在让我困惑的是为什么在上面的代码中使用互斥锁,而没有它也可以完成同样的事情(使用pthread_join)?如果 pthread_join 阻止另一个线程 运行ning 直到第一个线程完成,那么我认为它已经阻止了另一个线程访问计数器值。 pthread_mutex_lock 的目的是什么?
连接阻止起始线程 运行ning(并因此终止进程)直到 thread1 和 thread2 完成。它不提供 thread1 和 thread2 之间的任何同步。互斥锁阻止线程 1 在线程 2 修改计数器时读取计数器,反之亦然。
没有互斥锁,最明显的错误可能是线程 1 和线程 2 运行 完全同步。他们每个人从计数器中读取零,每个人加一,每个输出 "Counter value: 1".