【问题标题】:POSIX semaphores/threads not working correctly?POSIX 信号量/线程不能正常工作?
【发布时间】:2012-10-20 08:52:31
【问题描述】:

我有以下代码:

#include<stdio.h>
#include<semaphore.h>
#include<pthread.h>

sem_t semr;

void* func(void* i)
{
    sem_wait(&semr);
    printf("\nInstance %d running",*(int*)i);
    //sem_post(&semr);
    return NULL;
}


int main(void)
{
    sem_init(&semr,0,1);
    void* (*fp)(void*);
    int s1,s2,s3,val=0;
    pthread_t t1,t2,t3;
    fp=&func;
    val=1;
    s1=pthread_create(&t1,NULL,fp,(void*)&val);
    val=2;
    s2=pthread_create(&t2,NULL,fp,(void*)&val);
    val=3;
    s3=pthread_create(&t3,NULL,fp,(void*)&val);
    pthread_join(t1,NULL);
    pthread_join(t2,NULL);
    pthread_join(t3,NULL);  
    return 0;
}
  

这是我对发生的事情的理解:

第一个线程(t1) 成功执行。随后的线程(t2t3)虽然被阻止,因为我从来没有 sem_post 信号量。 pthread_joins 将使 main() 等待所有 3 个线程终止。

会发生这种情况:

两个线程都不会输出任何东西。甚至没有t1s 输出(见下面的问题 1)

然而,

删除所有pthread_joins 对我的期望有更好的效果: t1执行成功,返回命令提示符。

我的问题:

  1. 根据this page上的示例代码,main()应该等待t2t3终止(除了成功执行t1输出一些东西)。我在这里错误地使用pthread_join 吗?发生了什么事?

  2. 为什么会发生阻塞线程(t2t3)?线程是否因main() 返回而强制终止?

【问题讨论】:

  • 你的程序(一旦你修复了var 未被声明)并没有按照你说的那样做。它确实输出了一些东西(换行符)。
  • 此代码无法编译。 val 从未被声明过。请发布一个完整的示例来展示您的问题。
  • @black_station : 我编辑了你的代码 - 添加了 \n ..现在复制此代码并执行 -- 会正常工作。
  • @CharlesBailey:是的,很抱歉做出了改变!
  • 不要投到void*,这是多余的,只会增加噪音。

标签: c linux pthreads posix semaphore


【解决方案1】:

您应该确保您打印的任何内容都以换行符终止(不跟随)。 stdout 不会被刷新,而 main 被阻止等待加入您的线程。当您再次显式取消程序时,stdout 不会被刷新。

【讨论】:

  • 当我在 printf 末尾添加一个 \n 时,它可以正常工作,为什么会这样?
  • @GrijeshChauhan:你的意思是什么?我的测试打印了“Instance 3 running”,这(从文本中)听起来不像预期的那样。
  • 上面的代码不会打印“Instance 3 running”,但是如果我在 funtc() 的 printf() 末尾添加 '\n' 然后重新编译并执行它会打印“Instance 3 running” . -- 在我的系统中..为什么会这样?
  • @CharlesBailey/Grijesh:请注意,线程t1 可能会看到其线程参数的值为 3(因此它将打印“实例 3 正在运行”),因为它可能不会被安排执行,直到在创建第三个线程之后,val 将被设置为 3
  • @GrijeshChauhan:在字符串末尾添加'\n' 会导致printf() 刷新stdio。如果没有'\n',文本行只会保留在缓冲区中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
相关资源
最近更新 更多