一个关于pthread_mutex_trylock问题

hanb99 2007-07-05 07:10:13
环境:ubuntu6.06+gcc4.0.3
关于pthread_mutex_trylock我是这样理解的:这个函数尝试锁住互斥体变量,如果互斥体没有上锁,那么加锁,否则返回一个消息,这样可以防止死锁的产生。
可是在我测试的时候发现它根本不能锁住变量,请大家看一下是我那里写错了。
#include <pthread.h>
#include <stdio.h>
int ggg;
pthread_mutex_t mut1; //= PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mut2;
void *fun1(void *str)
{
unsigned int s;
s = pthread_self();
int p;
while(1)
{
if (!pthread_mutex_trylock(&mut1))
{
//sleep(1);
if (!pthread_mutex_trylock(&mut2))
{ ggg = s % 1000;
printf("fun111 %d pth :: %u --> ggg is %d\n", (int)str, s, ggg);
sleep(1);
printf("fun111 %d pth :: %u **> ggg is %d\n", (int)str, s, ggg);
pthread_mutex_unlock(&mut1);
pthread_mutex_unlock(&mut2);
return 0;
}else
{
//printf("fun111 mut2 %d pth :: %u\n", (int)str, s);
pthread_mutex_unlock(&mut2);
usleep(1000);
}
}else
{//printf("fun111 mut1 %d pth :: %u\n", (int)str, s);
pthread_mutex_unlock(&mut1);
usleep(1000);
}
}
}

void *fun2(void *str)
{
unsigned int s;
s = pthread_self();
int p;
while(1)
{
if (!pthread_mutex_trylock(&mut2))
{
//sleep(2);
if (!pthread_mutex_trylock(&mut1))
{ ggg = s % 1000;
printf("fun222 %d pth :: %u --> ggg is %d\n", (int)str, s, ggg);
sleep(1);
printf("fun222 %d pth :: %u **> ggg is %d\n", (int)str, s, ggg);
pthread_mutex_unlock(&mut2);
pthread_mutex_unlock(&mut1);
return 0;
}else
{//printf("fun222 mut1 %d pth :: %u\n", (int)str, s);
pthread_mutex_unlock(&mut1);
usleep(1000);
}
}else
{//printf("fun222 mut2 %d pth :: %u\n", (int)str, s);
pthread_mutex_unlock(&mut2);
usleep(1000);
}
}
}


int main()
{
int i;
pthread_t pthid[100];
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_mutex_init(&mut2, NULL);
pthread_mutex_init(&mut1, NULL);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
for (i = 0; i < 3; ++i)
{
pthread_create(&pthid[i], &attr, fun1, (void*)i);
pthread_create(&pthid[i+20], &attr, fun2, (void*)(i+20));
//pthread_join(pthid[i], NULL);
}
sleep(100);
}
----------------------
结果:
fun111 0 pth :: 3084729264 --> ggg is 264
fun222 21 pth :: 3059551152 --> ggg is 152
fun222 20 pth :: 3076336560 --> ggg is 560
fun222 22 pth :: 3042765744 --> ggg is 744
fun111 2 pth :: 3051158448 --> ggg is 448
fun111 1 pth :: 3067943856 --> ggg is 856
fun111 0 pth :: 3084729264 **> ggg is 856//以下这些都不对了
fun222 21 pth :: 3059551152 **> ggg is 856
fun222 20 pth :: 3076336560 **> ggg is 856
fun222 22 pth :: 3042765744 **> ggg is 856
fun111 2 pth :: 3051158448 **> ggg is 856
fun111 1 pth :: 3067943856 **> ggg is 856//这个除外
---------------------
为什么这样,它根本就没有锁住变量,照理说它应该和pthread_mutex_lock是一样的效果呀
...全文
3811 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
FCARM 2012-03-06
  • 打赏
  • 举报
回复
我也碰到锁不住的问题
热爱生活 2012-02-14
  • 打赏
  • 举报
回复
??????????????????????????
antagent 2011-08-23
  • 打赏
  • 举报
回复

#include <pthread.h>
#include <stdio.h>
int ggg;
pthread_mutex_t mut1; //= PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mut2;
void *fun1(void *str)
{
unsigned int s;
s = pthread_self();
int p;
while(1)
{
if (!pthread_mutex_trylock(&mut1))
{
//sleep(1);
if (!pthread_mutex_trylock(&mut2))
{
ggg = s % 1000;
printf( "fun111 %d pth :: %u --> ggg is %d\n ", (int)str, s, ggg);
sleep(1);
printf( "fun111 %d pth :: %u **> ggg is %d\n ", (int)str, s, ggg);
pthread_mutex_unlock(&mut1);
pthread_mutex_unlock(&mut2);
return 0;
}
else
{
//printf( "fun111 mut2 %d pth :: %u\n ", (int)str, s);
pthread_mutex_unlock(&mut1);
usleep(1000);
}
}
else
{
//printf( "fun111 mut1 %d pth :: %u\n ", (int)str, s);
// pthread_mutex_unlock(&mut1);
usleep(1000);
}
}
}

void *fun2(void *str)
{
unsigned int s;
s = pthread_self();
int p;
while(1)
{
if (!pthread_mutex_trylock(&mut2))
{
//sleep(2);
if (!pthread_mutex_trylock(&mut1))
{
ggg = s % 1000;
printf( "fun222 %d pth :: %u --> ggg is %d\n ", (int)str, s, ggg);
sleep(1);
printf( "fun222 %d pth :: %u **> ggg is %d\n ", (int)str, s, ggg);
pthread_mutex_unlock(&mut2);
pthread_mutex_unlock(&mut1);
return 0;
}
else
{
//printf( "fun222 mut1 %d pth :: %u\n ", (int)str, s);
pthread_mutex_unlock(&mut2);
usleep(1000);
}
}
else
{
//printf( "fun222 mut2 %d pth :: %u\n ", (int)str, s);
// pthread_mutex_unlock(&mut2);
usleep(1000);
}
}
}


int main()
{
int i;
pthread_t pthid[100];
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_mutex_init(&mut2, NULL);
pthread_mutex_init(&mut1, NULL);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
for (i = 0; i < 3; ++i)
{
pthread_create(&pthid[i], &attr, fun1, (void*)i);
pthread_create(&pthid[i+20], &attr, fun2, (void*)(i+20));
//pthread_join(pthid[i], NULL);
}
sleep(100);
}
WaterWalker 2007-07-06
  • 打赏
  • 举报
回复
else
{//printf("fun111 mut1 %d pth :: %u\n", (int)str, s);
pthread_mutex_unlock(&mut1);
usleep(1000);
}

---------------
没锁上为什么要解锁呢?
hanb99 2007-07-05
  • 打赏
  • 举报
回复
iu_81(黄云万里动风色,白波九道流雪山。) 说的和我想的差不多,不管如何,它都应该可以保证被
锁变量的互斥性,现在的问题是它没有,为什么呢???
iu_81 2007-07-05
  • 打赏
  • 举报
回复
非阻塞的锁定互斥锁pthread_mutex_trylock
#include <pthread.h>
int pthread_mutex_trylock( pthread_mutex_t *mutex );
返回值:函数成功返回0。任何其他返回值都表示错误。

函数是pthread_mutex_lock函数的非阻塞版本。如果mutex参数所指定的互斥锁已经被锁定
的话,调用pthread_mutex_trylock函数不会阻塞当前线程,而是立即返回一个值来描述互
斥锁的状况。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧