第一题:测试错误检查所和地柜所是否会造成死锁状态
静态创建锁时,编译出错加上-D _GNU_SOURCE
//错误检查锁的静态和动态创建,不会造成死锁
#include<myhead.h>
pthread_mutex_t m1;
pthread_mutex_t m2;
// pthread_mutex_t m1 = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
// pthread_mutex_t m2 = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
pthread_mutexattr_t arr;
void* run(void* arg)
{
while(1)
{
pthread_mutex_lock(&m1);
printf("a\n");
sleep(1);
}
}
int main(int argc, const char *argv[])
{
pthread_mutexattr_init(&arr1);
pthread_mutexattr_settype(&arr1,PTHREAD_MUTEX_ERRORCHECK_NP);
pthread_mutex_init(&m1,&arr);
pthread_mutex_init(&m2,&arr);
pthread_t id;
pthread_create(&id,0,run,0);
//pthread_mutex_init(&m1,0);
//pthread_mutex_init(&m2,0);
while(1)
{
pthread_mutex_lock(&m2);
printf("b\n");
sleep(1);
}
return 0;
}
递归锁会造成死锁
#include<myhead.h>
//静态创建2把锁
pthread_mutex_t m1 = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
pthread_mutex_t m2 = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
//pthread_mutex_t m1;
//pthread_mutex_t m2;
void* run(void* arg)
{
while(1)
{
// pthread_mutex_lock(&m2);
// pthread_mutex_lock(&m2);
pthread_mutex_lock(&m2);
// pthread_mutex_lock(&m2);
// pthread_mutex_lock(&m2);
sleep(1);
printf("a\n");
// pthread_mutex_unlock(&m1);//解锁三次
//pthread_mutex_unlock(&m1);
pthread_mutex_unlock(&m1);
}
}
int main(int argc, const char *argv[])
{
pthread_mutex_init(&m1,0);
pthread_mutex_init(&m2,0);
//动态创建
//设置锁的属性为递归锁
// pthread_mutexattr_t attr;
// pthread_mutexattr_init(&attr);
// pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP);
//初始化锁
// pthread_mutex_init(&m1,&attr);
// pthread_mutex_init(&m2,&attr);
pthread_t id;
pthread_create(&id,0,run,NULL);
while(1)
{
//pthread_mutex_lock(&m1);//上锁三次
//pthread_mutex_lock(&m1);
//pthread_mutex_lock(&m1);
//pthread_mutex_lock(&m1);
//pthread_mutex_lock(&m1);
pthread_mutex_lock(&m1);
printf("A\n");
sleep(1);
pthread_mutex_unlock(&m2);
}
return 0;
}
第二题:有2条隧道,一条快速隧道,一条普通隧道。有5列火车,3列复兴号,2列绿皮
要求:复兴号2条隧道都能走,绿皮车只能走普通隧道,模拟火车过隧道的场景
#include<myhead.h>
typedef struct Msg
{
int type;
// pthread_mutex_t this_mutex;
}Msg,*msg_ptr;
pthread_mutex_t m1;
pthread_mutex_t m2;
//11 12 12 代表高铁
//21 22 代表绿皮车
void* tunnel(void *arg)
{
msg_ptr ptr = (msg_ptr)arg;
int type = ptr->type;
while(1){
if(type == 11 || type == 12 || type==13)
{
//pthread_mutex_this_m1 = ptr.this_mutex;
//pthread_mutex_lock(this_m1);
pthread_mutex_lock(&m1);
printf("高铁%d正在通过快速隧道\n\n",type);
sleep(2);
printf("高铁%d已经通过快速隧道\n\n",type);
pthread_mutex_unlock(&m1);
pthread_mutex_lock(&m2);
printf("高铁%d正在通过慢速隧道\n\n",type);
sleep(2);
printf("高铁%d已经通过慢速隧道\n\n",type);
pthread_mutex_unlock(&m2);
}
else if(type == 21 || type == 22)
{
//pthread_mutex_t this_m2 = ptr.this_mutex;
pthread_mutex_lock(&m2);
printf("绿皮%d正在通过慢速隧道\n\n",type);
sleep(4);
printf("绿皮%d已经通过慢速隧道\n\n",type);
pthread_mutex_unlock(&m2);
}
}
}
int main(int argc, const char *argv[])
{
pthread_mutex_init(&m1,0);
pthread_mutex_init(&m2,0);
int type;
pthread_t fast1,fast2,fast3,slow1,slow2;
Msg msg[5] = {{11},{12},{13},{21},{22}};
pthread_create(&fast1,0,tunnel,&msg[0]);
pthread_create(&fast2,0,tunnel,&msg[1]);
pthread_create(&fast3,0,tunnel,&msg[2]);
pthread_create(&slow1,0,tunnel,&msg[3]);
pthread_create(&slow2,0,tunnel,&msg[4]);
pthread_detach(fast1);
pthread_detach(fast2);
pthread_detach(fast3);
pthread_detach(slow1);
pthread_detach(slow2);
while(1);
return 0;
}
第三题:编写2个线程
#include<myhead.h>
void* run(void* arg)
{
printf("子线程代码\n");
}
int main(int argc, const char *argv[])
{
pthread_t id1;
pthread_t id2;
pthread_create(&id1,0,run,0);
pthread_create(&id2,0,run,0);
pthread_detach(id1);
pthread_detach(id2);
while(1);
return 0;
}