gpt4 book ai didi

c - 为什么我的所有线程都使用 sleep() 进行 sleep ?

转载 作者:行者123 更新时间:2023-11-30 17:20:15 27 4
gpt4 key购买 nike

我在网上看到了下面一段关于 Linux 线程的代码。但是当我运行它时,所有线程似乎都在 sleep ,而不仅仅是主线程。为什么?另外,如果没有 sleep(5),“线程创建成功”语句会运行 3 次而不是 2 次?有人可以解释一下这种行为吗?谢谢编译使用:gcc -pthread检查.c

和我的o/p:第一线程处理n线程创建成功二线加工n线程创建成功

前两行延迟 5 秒打印,接下来的两行延迟 5 秒打印。为什么子线程而不是主线程处于休眠状态?

#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
pthread_t tid[2];

void* doSomeThing()

{
unsigned long i = 0;
pthread_t id = pthread_self();

if (pthread_equal(id,tid[0]))
{
printf("\n First thread processingn");
}
else
{
printf("\n Second thread processingn");
}
return NULL;
}
int main(void)
{
int i = 0;
int err;
while (i < 2)
{
err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
sleep(5);
if (err != 0)
printf("\ncan't create thread [%s]", strerror(err))
else

printf("\n Thread created successfullyn");
i++;
// sleep(5);
}
pthread_join(tid[0],NULL);
pthread_join(tid[1],NULL);

return 0;
}

最佳答案

为什么你认为你的所有线程都在休眠?阅读一些pthreads tutorial & pthreads(7)

看起来您的线程很快就终止了。您应该使用 pthread_join(3) 加入它们(例如,在 sleep 之前,或在 main 内部的某个位置)

 for (int i=0; i<2; i++) {
void* retval = NULL;
pthread_join(tid[i], &retval);
// in your case, since doSomething gives NULL :
assert (retval == NULL);
}

或者您应该创建分离的线程,请参阅 pthread_create(3) & 例如 pthread_attr_init(3) & pthread_attr_setdetachstate(3)等等....

您应该编写代码(因为您希望 doSomeThing 获得 NULL 参数):

void* doSomeThing(void* arg) {
assert (arg == NULL);

顺便说一句,请使用 gcc -Wall -Wextra -g 进行编译并了解如何使用 gdb 调试器。

您可能应该调用 fflush(3) 在适当的地方(因为 stdio(3) 通常是 buffered ),例如在 doSomeThing 末尾调用 fflush(NULL);

了解undefined behavior并努力避免它。

在您期望输出的线程内执行 fflush(NULL); 非常重要(至少在结束它们之前)。您的问题与 sleep 无关,而是与缓冲有关。出于非常有效的性能原因,printf 经常被缓冲。您还应该养成以 \n 结束 printf 格式控制字符串的习惯(因为这经常刷新缓冲区)。仅将 \n 放在 printf 格式字符串的开头是一个坏习惯(应该放在末尾)。

<小时/>

顺便说一句,通过更正 void* doSomething(void*arg) 行(因为使用问题原始版本中给出的 void arg ,代码甚至不编译!)我在编译时观察到以下输出:

 % gcc -Wall -g x.c -pthread -o xx
x.c: In function 'doSomeThing':
x.c:11:19: warning: unused variable 'i' [-Wunused-variable]
unsigned long i = 0;
^

然后执行:

   % ./xx

Thread created successfully

First thread processing

Thread created successfully

Second thread processing

因此,问题中给出的代码在我的计算机上的行为并不如问题中所解释的那样。因此Harsh S. Kulshrestha应该通过提供准确源代码、完整的编译命令和准确输出来编辑他的问题。 FWIW,我的系统是 x86-64 上的 Linux/Debian/Sid,gcc 是版本 4.9.2,libc 是 Debian GLIBC 2.19-15

关于c - 为什么我的所有线程都使用 sleep() 进行 sleep ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28646159/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com