互斥信号量如何工作?
How mutex semaphore works?
我正在尝试多核编程,以实现 Mutex 信号量:
初始化;请求所有权;释放所有权;尝试所有权;毁灭.
我创建了 3 个线程。每个线程都对一个全局变量 Answer 进行操作。 10 次线程中有 9 次顺序执行。但是有时候线程3没有执行。第二个线程互斥锁没有释放吗?
这是我的代码:thread_tasks.cc
void *task1(void *X)
{
int MValue = pthread_mutex_init(&Mutex,NULL); //Initialization
pthread_mutex_lock(&Mutex); //Request ownership
Answer = Answer * 32; //critical section
pthread_mutex_unlock(&Mutex); //Release ownership
flag1=1;
cout << "\nthread A Answer = " << Answer << endl;
cout<<"\nthread 1 executed successfully";
}
void *task2(void *X)
{
if(flag1==1)
{
int RC = pthread_mutex_trylock(&Mutex); //Try ownership
cout<<"\nRC: "<<RC;
Answer = Answer/2;
flag2=1;
cout<<"\nthread 2 executed successfully";
pthread_mutex_unlock(&Mutex); //Release ownership
pthread_mutex_destroy(&Mutex); //Destruction
}
}
void *task3(void *X)
{
Answer = Answer+5;
cout<<"\nthread 3 executed successfully";
}
头文件:thread_tasks.h
using namespace std;
#include <iostream>
#include <pthread.h>
void *task1(void *X);
void *task2(void *X);
void *task3(void *X);
mutex_example.cpp
int Answer = 10;
int flag1 = 0;
int flag2 = 0;
int main(int argc, char *argv[])
{
pthread_t ThreadA, ThreadB, ThreadC;
cout << "Answer = " << Answer << endl;
pthread_create( &ThreadA,NULL,task1,NULL);
pthread_create( &ThreadB,NULL,task2,NULL);
pthread_create( &ThreadC,NULL,task3,NULL);
pthread_join(ThreadA,NULL);
pthread_join(ThreadB,NULL);
pthread_join(ThreadC,NULL);
cout << "Answer = " << Answer << endl;
return(0);
}
线程3函数的真正执行——task3需要flag2==1,此时可能线程2还没有完成flag2重置任务。所以任务 3 可能不会进入 if 块。
解决了问题:
使用 thread_1done 和 thread_2done 来维护序列。
void *task1(void *X)
{
int MValue = pthread_mutex_init(&Mutex,NULL); //Initialization
pthread_mutex_lock(&Mutex); //Request ownership
Answer = Answer * 32; //critical section
pthread_mutex_unlock(&Mutex); //Release ownership
thread_1done=1;
cout << "\nthread A Answer = " << Answer << endl;
cout<<"thread 1 executed successfully"<<endl;
}
void *task2(void *X)
{
while(1)
if(thread_1done==1)
{
int RC = pthread_mutex_trylock(&Mutex); //Try ownership
Answer = Answer/2;
pthread_mutex_unlock(&Mutex);
thread_2done=1;
cout << "\nthread B Answer = " << Answer << endl;
cout<<"thread 2 executed successfully"<<endl;
break;
}
}
void *task3(void *X)
{
while(1)
if (thread_2done==1 && thread_1done == 1)
{
int RC = pthread_mutex_trylock(&Mutex); //Try ownership
Answer = Answer+5;
pthread_mutex_unlock(&Mutex);
pthread_mutex_destroy(&Mutex); //Destruction
cout << "\nthread C Answer = " << Answer << endl;
cout<<"thread 3 executed successfully"<<endl;
break;
}
}
我正在尝试多核编程,以实现 Mutex 信号量: 初始化;请求所有权;释放所有权;尝试所有权;毁灭.
我创建了 3 个线程。每个线程都对一个全局变量 Answer 进行操作。 10 次线程中有 9 次顺序执行。但是有时候线程3没有执行。第二个线程互斥锁没有释放吗?
这是我的代码:thread_tasks.cc
void *task1(void *X)
{
int MValue = pthread_mutex_init(&Mutex,NULL); //Initialization
pthread_mutex_lock(&Mutex); //Request ownership
Answer = Answer * 32; //critical section
pthread_mutex_unlock(&Mutex); //Release ownership
flag1=1;
cout << "\nthread A Answer = " << Answer << endl;
cout<<"\nthread 1 executed successfully";
}
void *task2(void *X)
{
if(flag1==1)
{
int RC = pthread_mutex_trylock(&Mutex); //Try ownership
cout<<"\nRC: "<<RC;
Answer = Answer/2;
flag2=1;
cout<<"\nthread 2 executed successfully";
pthread_mutex_unlock(&Mutex); //Release ownership
pthread_mutex_destroy(&Mutex); //Destruction
}
}
void *task3(void *X)
{
Answer = Answer+5;
cout<<"\nthread 3 executed successfully";
}
头文件:thread_tasks.h
using namespace std;
#include <iostream>
#include <pthread.h>
void *task1(void *X);
void *task2(void *X);
void *task3(void *X);
mutex_example.cpp
int Answer = 10;
int flag1 = 0;
int flag2 = 0;
int main(int argc, char *argv[])
{
pthread_t ThreadA, ThreadB, ThreadC;
cout << "Answer = " << Answer << endl;
pthread_create( &ThreadA,NULL,task1,NULL);
pthread_create( &ThreadB,NULL,task2,NULL);
pthread_create( &ThreadC,NULL,task3,NULL);
pthread_join(ThreadA,NULL);
pthread_join(ThreadB,NULL);
pthread_join(ThreadC,NULL);
cout << "Answer = " << Answer << endl;
return(0);
}
线程3函数的真正执行——task3需要flag2==1,此时可能线程2还没有完成flag2重置任务。所以任务 3 可能不会进入 if 块。
解决了问题: 使用 thread_1done 和 thread_2done 来维护序列。
void *task1(void *X)
{
int MValue = pthread_mutex_init(&Mutex,NULL); //Initialization
pthread_mutex_lock(&Mutex); //Request ownership
Answer = Answer * 32; //critical section
pthread_mutex_unlock(&Mutex); //Release ownership
thread_1done=1;
cout << "\nthread A Answer = " << Answer << endl;
cout<<"thread 1 executed successfully"<<endl;
}
void *task2(void *X)
{
while(1)
if(thread_1done==1)
{
int RC = pthread_mutex_trylock(&Mutex); //Try ownership
Answer = Answer/2;
pthread_mutex_unlock(&Mutex);
thread_2done=1;
cout << "\nthread B Answer = " << Answer << endl;
cout<<"thread 2 executed successfully"<<endl;
break;
}
}
void *task3(void *X)
{
while(1)
if (thread_2done==1 && thread_1done == 1)
{
int RC = pthread_mutex_trylock(&Mutex); //Try ownership
Answer = Answer+5;
pthread_mutex_unlock(&Mutex);
pthread_mutex_destroy(&Mutex); //Destruction
cout << "\nthread C Answer = " << Answer << endl;
cout<<"thread 3 executed successfully"<<endl;
break;
}
}