互斥锁和解锁的一些解释
some explanations for mutex lock and unlock
我现在正在处理进程之间的同步,特别是互斥量和信号量,所以我找到了一些关于该主题的视频和代码。
我的问题是:
- 何时将
pthread_mutex_lock
放在 pthread_create
之前,而不是将其放在线程函数中?
- 下面的代码显示我在
pthread_create
之前加了锁,当我在线程函数中再次加锁时,结果完全一样,那么两者有什么区别呢?
有没有什么书可以让我从中挑选出那些东西的,请给出书名。
代码:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int T[5];
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* fct1(void* arg){
int i = 0;
while(i<5){
//debut de la section critique
T[i] = 2 * (i+1);
printf("le thread 1 ecrit : %d\n",T[i]);
i++;
}
pthread_mutex_unlock(&mutex);
//fin de la section critique
pthread_exit(NULL);
}
void* fct2(void* arg){
int i = 0;
//debut de la section critique
pthread_mutex_lock(&mutex);
while(i<5){
printf("le thread 2 li : %d \n",T[i]);
i++;
}
pthread_mutex_unlock(&mutex);
//fin de la section critique
pthread_exit(NULL);
}
int main (){
pthread_t T1 , T2 ;
pthread_mutex_lock(&mutex);
pthread_create(&T1, NULL, fct1, NULL);
pthread_create(&T2, NULL, fct2, NULL);
pthread_join(T1, NULL);
pthread_join(T2, NULL);
return 0;
}
互斥锁应保护并发使用的变量免受...好吧..并发访问。
要成功完成此操作,需要在访问变量之前锁定互斥体。之后可以解锁。
这通常与任何函数调用无关(如果不是通过并发访问的函数指针完成的,在您显示的代码中不是这种情况)。
参考你的例子,并发访问变量是int T[5]
。
因此代码可能如下所示:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int T[5];
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* fct1(void* arg)
{
int i = 0;
while(i<5)
{
//debut de la section critique
pthread_mutex_lock(&mutex);
T[i] = 2 * (i+1);
printf("le thread 1 ecrit : %d\n",T[i]);
pthread_mutex_unlock(&mutex);
//fin de la section critique
i++;
}
pthread_exit(NULL);
}
void* fct2(void* arg){
int i = 0;
while(i<5)
{
//debut de la section critique
pthread_mutex_lock(&mutex);
printf("le thread 2 li : %d \n",T[i]);
pthread_mutex_unlock(&mutex);
//fin de la section critique
i++;
}
pthread_exit(NULL);
}
int main ()
{
pthread_t T1 , T2;
pthread_create(&T1, NULL, fct1, NULL);
pthread_create(&T2, NULL, fct2, NULL);
pthread_join(T1, NULL);
pthread_join(T2, NULL);
return 0;
}
我现在正在处理进程之间的同步,特别是互斥量和信号量,所以我找到了一些关于该主题的视频和代码。
我的问题是:
- 何时将
pthread_mutex_lock
放在pthread_create
之前,而不是将其放在线程函数中? - 下面的代码显示我在
pthread_create
之前加了锁,当我在线程函数中再次加锁时,结果完全一样,那么两者有什么区别呢?
有没有什么书可以让我从中挑选出那些东西的,请给出书名。
代码:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int T[5];
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* fct1(void* arg){
int i = 0;
while(i<5){
//debut de la section critique
T[i] = 2 * (i+1);
printf("le thread 1 ecrit : %d\n",T[i]);
i++;
}
pthread_mutex_unlock(&mutex);
//fin de la section critique
pthread_exit(NULL);
}
void* fct2(void* arg){
int i = 0;
//debut de la section critique
pthread_mutex_lock(&mutex);
while(i<5){
printf("le thread 2 li : %d \n",T[i]);
i++;
}
pthread_mutex_unlock(&mutex);
//fin de la section critique
pthread_exit(NULL);
}
int main (){
pthread_t T1 , T2 ;
pthread_mutex_lock(&mutex);
pthread_create(&T1, NULL, fct1, NULL);
pthread_create(&T2, NULL, fct2, NULL);
pthread_join(T1, NULL);
pthread_join(T2, NULL);
return 0;
}
互斥锁应保护并发使用的变量免受...好吧..并发访问。
要成功完成此操作,需要在访问变量之前锁定互斥体。之后可以解锁。
这通常与任何函数调用无关(如果不是通过并发访问的函数指针完成的,在您显示的代码中不是这种情况)。
参考你的例子,并发访问变量是int T[5]
。
因此代码可能如下所示:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int T[5];
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* fct1(void* arg)
{
int i = 0;
while(i<5)
{
//debut de la section critique
pthread_mutex_lock(&mutex);
T[i] = 2 * (i+1);
printf("le thread 1 ecrit : %d\n",T[i]);
pthread_mutex_unlock(&mutex);
//fin de la section critique
i++;
}
pthread_exit(NULL);
}
void* fct2(void* arg){
int i = 0;
while(i<5)
{
//debut de la section critique
pthread_mutex_lock(&mutex);
printf("le thread 2 li : %d \n",T[i]);
pthread_mutex_unlock(&mutex);
//fin de la section critique
i++;
}
pthread_exit(NULL);
}
int main ()
{
pthread_t T1 , T2;
pthread_create(&T1, NULL, fct1, NULL);
pthread_create(&T2, NULL, fct2, NULL);
pthread_join(T1, NULL);
pthread_join(T2, NULL);
return 0;
}