互斥锁和执行顺序
Mutex and order of execution
首先,我对 posix 编程还很陌生,仍然理解基本概念。我还是不太清楚怎么做 pthread_mutex_lock
pthread_mutex_unlock
工作。
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <pthread.h>
#inlcude <stdio.h>
pthread_mutex_t_mtx;
void* routine(void* i){
int j;
for(j = 0; j < 1000000; ++j){
pthread_mutex_lock(&mtx);
printf("Inside thread %d\n", i);
pthread_mutex_unlock(&mtx);
}
return NULL;
}
int main()
{
pthread_t th[3];
int i;
pthread_mutex_init(&mtx, NULL);
for(i = 1; i <= 2; ++i)
{
if(pthread_create(th + i, NULL, routine, i){
perror(NULL); return 1;
}
}
for(i = 1; i <=2; ++i)
pthread_join(th[i], NULL);
return 0;
}
以上程序的正确输出应该是什么?我认为由于互斥锁的锁定和解锁,会有 2000000 次迭代,但我不太清楚它们的完成顺序。第一个线程是否执行 for 的前 1000000 步?它甚至执行 20000000 中的第一个吗?还是更混乱的秩序造成的?
假设互斥量是全局互斥量,您将收到 2000000 条消息,每个线程 1000000 条。它们的顺序是随机的,但是它们不会相互干扰,因为每个打印件都受到互斥锁
的保护
编辑:我刚刚注意到,您在创建下一个线程之前加入。因此首先会有第一个线程的所有消息,然后是第二个线程的所有消息。在这种情况下,互斥锁根本不起作用。排序的原因很简单,您不会同时拥有一个以上的工作线程运行。
首先,我对 posix 编程还很陌生,仍然理解基本概念。我还是不太清楚怎么做 pthread_mutex_lock
pthread_mutex_unlock
工作。
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <pthread.h>
#inlcude <stdio.h>
pthread_mutex_t_mtx;
void* routine(void* i){
int j;
for(j = 0; j < 1000000; ++j){
pthread_mutex_lock(&mtx);
printf("Inside thread %d\n", i);
pthread_mutex_unlock(&mtx);
}
return NULL;
}
int main()
{
pthread_t th[3];
int i;
pthread_mutex_init(&mtx, NULL);
for(i = 1; i <= 2; ++i)
{
if(pthread_create(th + i, NULL, routine, i){
perror(NULL); return 1;
}
}
for(i = 1; i <=2; ++i)
pthread_join(th[i], NULL);
return 0;
}
以上程序的正确输出应该是什么?我认为由于互斥锁的锁定和解锁,会有 2000000 次迭代,但我不太清楚它们的完成顺序。第一个线程是否执行 for 的前 1000000 步?它甚至执行 20000000 中的第一个吗?还是更混乱的秩序造成的?
假设互斥量是全局互斥量,您将收到 2000000 条消息,每个线程 1000000 条。它们的顺序是随机的,但是它们不会相互干扰,因为每个打印件都受到互斥锁
的保护编辑:我刚刚注意到,您在创建下一个线程之前加入。因此首先会有第一个线程的所有消息,然后是第二个线程的所有消息。在这种情况下,互斥锁根本不起作用。排序的原因很简单,您不会同时拥有一个以上的工作线程运行。