linux 线程 无法唤醒,posix sem_post无法唤醒线程中sem init所在的sem_wait。 Linux的

这是一个奇怪的疑难问题初始化扫描电镜和第一destory它,然后我在thread.then再初始化它,我不能唤醒它again.the代码:posix sem_post无法唤醒线程中sem init所在的sem_wait。 Linux的

#include

#include

#include

#include

#include

#include

#include

#include

#include

sem_t sem;

int key = 1;

static void *

wait_func()

{

printf("i'm wait\n");

sem_wait(&sem);

}

static void *

cancel_func(void *arg)

{

pthread_t tid = *(pthread_t *)arg;

if (key == 1)

{

sleep(1);

key = 0;

}

else

sleep(3);

if(pthread_cancel(tid) == 0)

printf("cancle!\n");

sem_init(&sem, 0, 0);

sem_destroy(&sem);

}

int

main(int argc, char *argv[])

{

pthread_t wthread, cthread;

pthread_attr_t attr;

int i = 0;

pthread_attr_init(&attr);

pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

sem_init(&sem, 0, 0);

while (i < 2)

{

// sem_init(&sem, 0, 0);

pthread_create(&wthread, &attr, wait_func, NULL);

if (i < 1)

pthread_create(&cthread, &attr, cancel_func, &wthread);

if (key == 0)

{

sleep(2);

if (sem_post(&sem) == 0)

printf("post!\n");

key = 1;

}

sleep(4);

++i;

}

sleep(1000);

}

然而,将工作,改变sem_init在while循环类似评论,所以我必须straced两个编程和瑶池1)初始化线程,sem_post没叫sys_futex,像这样:

nanosleep({2, 0}, i'm wait

{2,0}) (0,“post!\ n”,6post! )= 6

2)初始化在主处理中,sem_post呼叫sys_futex,像这样:

nanosleep({2, 0}, i'm wait

{2,0})= 0 futex的(0x600dc0,FUTEX_WAKE_PRIVATE,1)= 1只 写(1,“后! \ n“,6post! )= 6

然后,我想也许这是一个syscall问题。我用gdb反汇编了sem_post中的两个程序。不幸的是,1)线程中的init,它也调用sem_post中的syscall; 2)比较它们的注册表状态,其中rip是系统调用,也是一样。

in thread:

rax 0xca 202 //sys_futex

rbx 0x3c0e61bbc0 257939323840

rcx 0x0 0 //utime

rdx 0x1 1 //val

rsi 0x81 129 //op:private_wake

rdi 0x600dc0 6294976 //sem uaddr

in main process:

rax 0xca 202

rbx 0x3c0e61bbc0 257939323840

rcx 0x0 0

rdx 0x1 1

rsi 0x81 129

rdi 0x600da0 6294944

最后,我不知道这个问题。请给我一些建议找出解决方案,谢谢。

+0

这是一个实际的问题?如果你不会不断创建并销毁信号量,那么没有问题,对吧?除此之外,使用共享密钥状态变量,短暂休眠和多线程,我不知道你的代码实际上在做什么。我很抱歉,我准备纠正,但这听起来像'我正在用信号量做一些不切实际和奇怪的事情,而且我正在发生奇怪的行为'。如果你创建了信号量并且不摧毁它,你很好,是吗? –

2012-04-03 16:53:53

+0

是的,它可以重复每次使用我的示例代码。我读了一些sem_init的手册页说,不要在许多线程中初始化相同的sem,但是,我不清楚关于同一个sem的一个uaddr或init init sem var两次。代码无关,只做sem_wait contented.Trace汇编代码,它确实调用了syscall(futex_wake),但strace不会转储这个系统调用,这很奇怪。 –

2012-04-04 03:08:40

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值