社区
Linux_Kernel
帖子详情
请教:pthread_mutex_lock()后加sleep(1)=解锁?
sz_hiter
2009-11-10 03:02:07
测试时发现,利用pthread_mutex_lock()进行加所有,如果在后面调用了sleep或usleep函数后,这个锁就不起作用了!!
怎么会这样?
...全文
1741
11
打赏
收藏
请教:pthread_mutex_lock()后加sleep(1)=解锁?
测试时发现,利用pthread_mutex_lock()进行加所有,如果在后面调用了sleep或usleep函数后,这个锁就不起作用了!! 怎么会这样?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sz_hiter
2009-11-12
打赏
举报
回复
[Quote=引用 10 楼 guosha 的回复:]
因为你的主线程在创建好两个子线程后就直接把mutex销毁了, 所以你的两个子线程使用mutex的时候,mutex可能已经被销毁了,而根据POSIX规定,使用销毁了的mutex的行为未定义.
[/Quote]
中的!!!!!
多谢!!!
快乐田伯光
2009-11-11
打赏
举报
回复
因为你的主线程在创建好两个子线程后就直接把mutex销毁了, 所以你的两个子线程使用mutex的时候,mutex可能已经被销毁了,而根据POSIX规定,使用销毁了的mutex的行为未定义.
wangqingshui531
2009-11-10
打赏
举报
回复
你试试
if (0 != pthread_mutex_lock(&mutex))
{
perror("mutex:");
exit(-1);
}
看看错误原因是什么?
sz_hiter
2009-11-10
打赏
举报
回复
我看你的程序在线程中比我少了while,我也这样试了一把,还是不行,打印输出如下:
[root@localhost pthread]# ./test_thread_mutex
testthread1 : multi_data = 1
testthread2 : multi_data = 0
testthread1 : multi_data = 1
testthread2 : multi_data = 0
testthread1 : multi_data = 1
testthread2 : multi_data = 0
bye !
wangqingshui531
2009-11-10
打赏
举报
回复
testthread1 : multi_data = 1
testthread1 : multi_data = 2
testthread1 : multi_data = 3
testthread2 : multi_data = 2
testthread2 : multi_data = 1
testthread2 : multi_data = 0
bye !
wangqingshui531
2009-11-10
打赏
举报
回复
是的
sz_hiter
2009-11-10
打赏
举报
回复
不加 -lpthread就无法编译通过的。。。
这样的,那就更加奇怪了。。。你打印出来时这样么?
testthread1 : multi_data = 1
testthread1 : multi_data = 2
testthread1 : multi_data = 3
testthread2 : multi_data = 2
testthread2 : multi_data = 1
testthread2 : multi_data = 0
wangqingshui531
2009-11-10
打赏
举报
回复
你编译的时候是不是没有使用 -lpthread?
我测试没问题的呀
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <pthread.h>
5
6 pthread_mutex_t mutex;
7 int multi_data;
8
9 void test_fn(int type)
10 {
11 pthread_mutex_lock(&mutex);
12 if(type == 1)
13 {
14 multi_data ++;
15 printf("testthread1 : multi_data = %d\n",multi_data);
16 usleep(500000);
17
18 multi_data ++;
19 printf("testthread1 : multi_data = %d\n",multi_data);
20 usleep(500000);
21 multi_data ++;
22 printf("testthread1 : multi_data = %d\n",multi_data);
23 usleep(500000);
24 }
25 else if(type == 2)
26 {
27 multi_data --;
28 printf("testthread2 : multi_data = %d\n",multi_data);
29 usleep(500000);
30 multi_data --;
31 printf("testthread2 : multi_data = %d\n",multi_data);
32 usleep(500000);
33 multi_data --;
34 printf("testthread2 : multi_data = %d\n",multi_data);
35 usleep(500000);
36 }
37 pthread_mutex_unlock(&mutex);
38 }
39
40 void *testthread1(void *arg)
41 {
42
43
44 test_fn(1);
45
46
47
48
49 }
50
51 void *testthread2(void *arg)
52 {
53
54
55 test_fn(2);
56
57
58 }
59
60 int main(int argnum, char *arg[])
61 {
62 int ret;
63 pthread_t pthread1,pthread2;
64 void *thread_ret;
65
66 multi_data = 0;
67
68 pthread_mutex_init(&mutex,NULL);
69
70 ret = pthread_create(&pthread1,NULL,testthread1,NULL);
71 if(ret != 0)
72 {
73 printf("create pthread1 failure !\n");
74 return 0;
75 }
76
77 ret = pthread_create(&pthread2,NULL,testthread2,NULL);
78 if(ret != 0)
79 {
80 printf("create pthread2 failure !\n");
81 return 0;
82 }
83
84 pthread_mutex_destroy(&mutex);
85
86 ret = pthread_join(pthread1, &thread_ret);
87 ret = pthread_join(pthread2, &thread_ret);
88 printf("bye !\n");
89
90 }
sz_hiter
2009-11-10
打赏
举报
回复
有人知道么?
sz_hiter
2009-11-10
打赏
举报
回复
测试目的是锁住后只有其中的一个线程来操作,应该打印:
testthread1 : multi_data = 1
testthread1 : multi_data = 2
testthread1 : multi_data = 3
testthread2 : multi_data = 2
testthread2 : multi_data = 1
testthread2 : multi_data = 0
但是如果按照上面的来做,打印为:
testthread1 : multi_data = 1
testthread2 : multi_data = 0
testthread1 : multi_data = 1
testthread2 : multi_data = 0
testthread1 : multi_data = 1
testthread2 : multi_data = 0
但是如果执行“//”的那些内容的话,输出就是正常的。。
也就是说利用pthread_mutex_lock()进行加锁后,如果在后面调用了sleep或usleep函数后,这个锁就不起作用了。
怎么会这样??
sz_hiter
2009-11-10
打赏
举报
回复
附上测试代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
pthread_mutex_t mutex;
int multi_data;
void test_fn(int type)
{
pthread_mutex_lock(&mutex);
if(type == 1)
{
multi_data ++;
printf("testthread1 : multi_data = %d\n",multi_data);
usleep(500000); //
multi_data ++;
printf("testthread1 : multi_data = %d\n",multi_data);
usleep(500000); //
multi_data ++;
printf("testthread1 : multi_data = %d\n",multi_data);
usleep(500000); //
}
else if(type == 2)
{
multi_data --;
printf("testthread2 : multi_data = %d\n",multi_data);
usleep(500000); //
multi_data --;
printf("testthread2 : multi_data = %d\n",multi_data);
usleep(500000); //
multi_data --;
printf("testthread2 : multi_data = %d\n",multi_data);
usleep(500000); //
}
pthread_mutex_unlock(&mutex);
}
void *testthread1(void *arg)
{
while(1)
{
test_fn(1);
// usleep(500000);
}
}
void *testthread2(void *arg)
{
while(1)
{
test_fn(2);
// usleep(500000);
}
}
int main(int argnum, char *arg[])
{
int ret;
pthread_t pthread1,pthread2;
void *thread_ret;
multi_data = 0;
pthread_mutex_init(&mutex,NULL);
ret = pthread_create(&pthread1,NULL,testthread1,NULL);
if(ret != 0)
{
printf("create pthread1 failure !\n");
return 0;
}
ret = pthread_create(&pthread2,NULL,testthread2,NULL);
if(ret != 0)
{
printf("create pthread2 failure !\n");
return 0;
}
pthread_mutex_destroy(&mutex);
ret = pthread_join(pthread1, &thread_ret);
ret = pthread_join(pthread2, &thread_ret);
printf("bye !\n");
}
linux_线程锁
mutex
(互斥量)_线程同步_死锁现象_p
thread
_
mutex
_
lock
函数_p
thread
_
mutex
_un
lock
函数_死锁现象
线程锁,p
thread
_
mutex
_
lock
函数 p
thread
_
mutex
_un
lock
函数 当T1再次获得cpu继续 从失去cpu的位置向后写入1,当执行结束,内存中的100字节,既不是全1,也不是全0。4、main 中加n= 10 将n在while中-- 这时,主线程输出10次后退出,调用p
thread
_cancel()将子线程退出,销毁锁。以上3点中,前两点不能改变,欲提高效率,传递数据,资源必须共享。un
lock
主动
解锁
函数,同时将阻塞在该锁上的所有线程全部唤醒,至于哪个线程先被唤醒,取决于优先
Linux线程同步之互斥量加锁
解锁
p
thread
_
mutex
_init、p
thread
_
mutex
_destroy、p
thread
_
mutex
_
lock
、 p
thread
_
mutex
_un
lock
Linux线程同步之互斥量加锁
解锁
p
thread
_
mutex
_init、p
thread
_
mutex
_destroy、p
thread
_
mutex
_
lock
、 p
thread
_
mutex
_un
lock
Linux互斥锁p
thread
_
mutex
_
lock
和p
thread
_
mutex
_un
lock
当一个进程中存在两个及以上的线程时,线程间会互相争夺共享资源,导致单个线程中的执行秩序会被打乱。我们在使用的时候,应该把 *
mutex
定义为全局变量,这样所有的线程都能使用。参数说明: *
mutex
互斥锁的索引(名称),注意这里同样是指针变量。参数说明: *
mutex
互斥锁的索引(名称),注意这里同样是指针变量。参数说明: *
mutex
互斥锁的索引(名称),注意这里同样是指针变量。2、销毁互斥锁p
thread
_
mutex
_destroy();1. *
mutex
互斥量的索引(名称),为指针变量;
Linux中互斥锁/读写锁的概念及使用、死锁的避免(p
thread
_
mutex
_
lock
、p
thread
_
mutex
_un
lock
、p
thread
_rw
lock
_rd
lock
、p
thread
_rw)
互斥锁的概念和使用 线程通信-互斥 临界资源:一次只允许一个任务(进程、线程)访问的共享资源 临界区:访问临界资源的代码 互斥机制:
mutex
互斥锁,任务访问临界资源前申请锁,访问完后释放锁 互斥锁初始化 两种方法创建互斥锁,静态方式和动态方式 动态方式: int p
thread
_
mutex
_init(p
thread
_
mutex
_t *restrict
mutex
,const p
thread
_
mutex
attr_t *restrict attr); 其中
mutex
attr用于指定互斥锁属性,如果为NULL
【linux系统编程学习笔记】第十一节:线程的安全机制1(互斥锁)(p
thread
_
mutex
_
lock
、p
thread
_
mutex
_un
lock
、p
thread
_
mutex
_init )
互斥锁 安全机制 互斥锁 互斥锁API p
thread
_
mutex
_init 初始化互斥锁 p
thread
_
mutex
_
lock
上锁 p
thread
_
mutex
_try
lock
尝试上锁 p
thread
_
mutex
_un
lock
解锁
p
thread
_
mutex
_destroy 销毁互斥锁 例程: 安全机制 由于线程它是共享进程里面所有的资源,自然包括虚拟内存里面的所有东西包(包含全局变量,堆内存,映射的内存及程序段落等),同时也继承了进程的所有资源...
Linux_Kernel
4,466
社区成员
17,461
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章