#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <vector>
#include <queue>
using namespace std;
pthread_mutex_t lockA;
pthread_mutex_t lockB;
pthread_mutex_t lockC;
int i = 1;
void* funA(void* args)
{
while(1)
{
pthread_mutex_lock(&lockB);
pthread_mutex_lock(&lockC);
printf("funA...A\n");
pthread_mutex_unlock(&lockB);
sleep(1);
pthread_mutex_unlock(&lockC);
sleep(1);
}
return NULL;
}
void* funB(void* args)
{
while(1)
{
pthread_mutex_lock(&lockC);
pthread_mutex_lock(&lockA);
printf("funB...B\n");
pthread_mutex_unlock(&lockC);
sleep(1);
pthread_mutex_unlock(&lockA);
sleep(1);
}
return NULL;
}
void* funC(void* args)
{
while(1)
{
pthread_mutex_lock(&lockB);
pthread_mutex_lock(&lockA);
printf("funC...C\n");
pthread_mutex_unlock(&lockA);
sleep(1);
pthread_mutex_unlock(&lockB);
sleep(1);
}
return NULL;
}
int main(int argc,const char* argv[])
{
pthread_t thd1;
pthread_t thd2;
pthread_t thd3;
pthread_mutex_init(&lockA, NULL);
pthread_mutex_init(&lockB, NULL);
pthread_mutex_init(&lockC, NULL);
pthread_create(&thd1, NULL, funA, NULL);
pthread_create(&thd2, NULL, funB, NULL);
pthread_create(&thd3, NULL, funC, NULL);
pthread_join(thd1, NULL);
pthread_join(thd2, NULL);
pthread_join(thd3, NULL);
pthread_mutex_destroy(&lockA);
pthread_mutex_destroy(&lockB);
pthread_mutex_destroy(&lockC);
return 0;
}
上面的程序容易造成死锁,例如 第一个线程 占有B,第二个线程占有C时
改进版
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <vector>
#include <queue>
using namespace std;
pthread_mutex_t lock;
// pthread_mutex_t lockA;
// pthread_mutex_t lockB;
// pthread_mutex_t lockC;
pthread_cond_t condA;
pthread_cond_t condB;
pthread_cond_t condC;
int i = 1;
void* funA(void* args)
{
while(1)
{
pthread_mutex_lock(&lock);
while(1)
{
pthread_cond_wait(&condA, &lock);
printf("funA...A\n");
}
pthread_mutex_unlock(&lock);
}
return NULL;
}
void* funB(void* args)
{
while(1)
{
pthread_mut