pthread_mutex_trylock和pthread_mutex_lock问题(没有加锁???)
时间:2011-07-21
来源:互联网
#include<iostream>
#include<pthread.h>
#include<string.h>
#include<stdio.h>
using namespace std;
pthread_mutex_t q_lock=PTHREAD_MUTEX_INITIALIZER;
void *read(void *arg)
{
int err=0;
while((err=pthread_mutex_trylock(&q_lock))!=0)
{
cout <<"read :"<< strerror(err) << endl;
}
/*err=pthread_mutex_lock(&q_lock);
if(err!=0)
{
cout << "error " << endl;
};
*/
cout << "first " << endl;
for(int i = 0;i<=5;i++)
cout << " " << i << endl;
err=pthread_mutex_unlock(&q_lock);
if(err!=0)
{
cout << "wrong " <<endl;
}
};
void *read1(void *arg)
{ int err=0;
while((err=pthread_mutex_trylock(&q_lock))!=0)
{
cout <<"read1:"<< strerror(err) <<endl;
}
/* err = pthread_mutex_trylock(&q_lock);
if(err == EBUSY)
{
cout << "busy " << endl;
}
*/
cout << "second " << endl;
for(int i = 0;i<=5;i++)
cout << " " << i << endl;
err=pthread_mutex_unlock(&q_lock);
if(err!=0)
{
cout << "wrong " <<endl;
}
}
int main()
{
pthread_t id1,id2;
int ret;
ret=pthread_create(&id1,NULL,read, NULL);
if(ret!=0)perror("pthread cread1");
ret=pthread_create(&id2,NULL,read1, NULL);
if(ret!=0)perror("pthread cread2");
pthread_join(id1,NULL);
pthread_join(id2,NULL);
return 0;
}
输出结果为:
first read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
....
..
..
..
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
0
1
2
3
4
read1: 5
Device or resource busy
second
0
1
2
3
4
5
输出的结果有点诡异,像是没有加锁,求解释。。。
#include<pthread.h>
#include<string.h>
#include<stdio.h>
using namespace std;
pthread_mutex_t q_lock=PTHREAD_MUTEX_INITIALIZER;
void *read(void *arg)
{
int err=0;
while((err=pthread_mutex_trylock(&q_lock))!=0)
{
cout <<"read :"<< strerror(err) << endl;
}
/*err=pthread_mutex_lock(&q_lock);
if(err!=0)
{
cout << "error " << endl;
};
*/
cout << "first " << endl;
for(int i = 0;i<=5;i++)
cout << " " << i << endl;
err=pthread_mutex_unlock(&q_lock);
if(err!=0)
{
cout << "wrong " <<endl;
}
};
void *read1(void *arg)
{ int err=0;
while((err=pthread_mutex_trylock(&q_lock))!=0)
{
cout <<"read1:"<< strerror(err) <<endl;
}
/* err = pthread_mutex_trylock(&q_lock);
if(err == EBUSY)
{
cout << "busy " << endl;
}
*/
cout << "second " << endl;
for(int i = 0;i<=5;i++)
cout << " " << i << endl;
err=pthread_mutex_unlock(&q_lock);
if(err!=0)
{
cout << "wrong " <<endl;
}
}
int main()
{
pthread_t id1,id2;
int ret;
ret=pthread_create(&id1,NULL,read, NULL);
if(ret!=0)perror("pthread cread1");
ret=pthread_create(&id2,NULL,read1, NULL);
if(ret!=0)perror("pthread cread2");
pthread_join(id1,NULL);
pthread_join(id2,NULL);
return 0;
}
输出结果为:
first read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
....
..
..
..
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
0
1
2
3
4
read1: 5
Device or resource busy
second
0
1
2
3
4
5
输出的结果有点诡异,像是没有加锁,求解释。。。
作者: shifuxinghua 发布时间: 2011-07-21
改用write替代cout试一试把.
作者: qq120848369 发布时间: 2011-07-21
这个说明已经加锁了,
first输出这个的时候以前是第一线程在运行,这时候跳到第二个线程 read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
....
..
..
..
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy //这时候第二个线程运行结束,跳到第一个线程
0
1
2
3
4
read1: 5//第一个线程释放锁
Device or resource busy//第二个线程运行
//获得锁second
0
1
2
3
4
5
运行结束。
first输出这个的时候以前是第一线程在运行,这时候跳到第二个线程 read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
....
..
..
..
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy
read1:Device or resource busy //这时候第二个线程运行结束,跳到第一个线程
0
1
2
3
4
read1: 5//第一个线程释放锁
Device or resource busy//第二个线程运行
//获得锁second
0
1
2
3
4
5
运行结束。
作者: yong_f 发布时间: 2011-07-21
结果看来是正常的啊,first先锁了,0-5输出完了以后释放锁,然后second才往下跑,很正常啊
作者: louyong0571 发布时间: 2011-07-21
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28