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

2023-12-27

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

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

前两行延迟 5 秒打印,接下来的 2 行延迟 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 教程 https://computing.llnl.gov/tutorials/pthreads/ & 并行线程(7) http://man7.org/linux/man-pages/man7/pthreads.7.html

看起来你的线程很快就终止了。你应该加入他们(例如在sleep,或者里面的某个地方main) using pthread_join(3) http://man7.org/linux/man-pages/man3/pthread_join.3.html

 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_创建(3) http://man7.org/linux/man-pages/man3/pthread_create.3.html&示例中pthread_attr_init(3) http://man7.org/linux/man-pages/man3/pthread_attr_init.3.html & pthread_attr_setdetachstate(3) http://man7.org/linux/man-pages/man3/pthread_attr_setdetachstate.3.html etc....

你应该已经编码了(因为你期望doSomeThing得到一个NULL争论):

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

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

你可能应该call 冲洗(3) http://man7.org/linux/man-pages/man3/fflush.3.html在适当的地方(因为stdio(3) http://man7.org/linux/man-pages/man3/stdio.3.html经常buffered http://en.wikipedia.org/wiki/Data_buffer),例如称呼fflush(NULL);在......的最后doSomeThing

阅读未定义的行为 http://en.wikipedia.org/wiki/Undefined_behavior并努力避免它。

重要的是要做fflush(NULL);在您期望输出的线程内部(至少在结束它们之前)。您的问题与以下内容无关sleep但要缓冲。和printf出于非常有效的性能原因,通常会被缓冲。你也应该戒掉这个习惯printf格式化控制字符串\n(因为这经常刷新缓冲区)。放一个\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

因此,问题中给出的代码在我的计算机上的行为并不如问题中所解释的那样。所以严酷的S·库尔什雷斯塔 https://stackoverflow.com/users/4207519/harsh-s-kulshrestha应该通过给出来编辑他的问题exact源代码,完整的编译命令,以及exact输出。 FWIW,我的系统是 x86-64 上的 Linux/Debian/Sid,gcc是版本4.9.2,libc是 Debian GLIBC 2.19-15

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的所有线程都使用 sleep() 进行睡眠? 的相关文章

  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 获取Windows下新线程/删除线程的通知

    创建 DLL 时 您可以在 DllMain 函数 DLL THREAD ATTACH DLL THREAD DETACH 中获取有关新线程 退出线程的通知 有没有办法在 非托管 可执行文件中从 Windows 获取这些或等效通知 是的 在您
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • “npm-run-all”未被识别为内部或外部命令

    我在 Windows 计算机上安装了 npm run all 并配置了环境变量 可能需要也可能不需要 但收到错误 npm run all 不被识别为内部或外部命令 可运行的程序或批处理文件 我正在尝试构建我当前的项目npm run buil
  • Prolog 析取

    考虑这个 Prolog 谓词 silly 1 1 silly 1 2 查询时 输出答案有两种状态 true 和 false 无论如何 有没有办法要求 Prolog 在析取中遇到 true 语句时立即终止 问题是 无论如何 有没有办法要求 P
  • 如何在按钮上创建计数器?

    我想在该按钮的中心创建文本 SomeText 的按钮 在按钮的右侧创建 0 的按钮 其中 0 是计数器 当我单击此按钮时 Counter 递增 并变为 1 我想知道如何将 textviev 与 按钮的右侧部分 联系起来
  • tcp:为什么只有第二次调用 Socket.Receive(byte[]) 返回数据?

    我的情况很典型 我需要通过 TCP 向服务器发送 请求 并接收响应 socket is connected socket Send CreateRequest byte br new byte VERY BIG BUFFER int cou
  • 使用nodejs对cassandra表上100,000个用户的记录应用更新查询。连接繁忙问题

    我正在使用 cassandra 3 x 和节点 10 13 0 我的工作记忆中有 100 000 个用户的数据 在给定代码中的地图 sortedRowMap 中 我通过迭代用户使用的地图 有 100 000 条记录 来更新所有记录 但它给我
  • 在字嵌入层中使用来自 fasttext 的 OOV 令牌中的子字信息 (keras/tensorflow)

    我有自己的 Fasttext 模型 并用它训练了带有词嵌入层的 keras 分类模型 但是 我想知道如何利用模型的子词信息来处理 OOV 单词 由于词嵌入层通过索引操作来查找词向量 而 OOV 词没有索引 即使 OOV 标记有索引 我如何为
  • MarkDown 源代码中的正则表达式惰性量词和否定类

    我正在浏览MarkDown http daringfireball net projects markdown John Gruber 用 Perl 编写的代码 有一个名为 Detab将制表符转换为空格 同时保留文本的缩进 有问题的代码行是
  • 无法解析模块“./index”

    过去几天 我的代码中一直收到无法解析模块索引的消息 并找到了临时解决方案 但无法找到永久修复 在过去的几天里 我一直收到此错误 并且当我运行 npm start reset cache 时找到了临时解决方案 但是每当我再次运行 react
  • 在 Google Colaboratory 上安装 faiss

    我尝试按照说明进行操作缪斯计划 https github com facebookresearch MUSE 他们需要 PyTorch 和 Faiss PyTorch 易于安装 但我发现安装有问题Faiss https github com
  • Bulma css 与 select2 jquery 插件

    我尝试实施select2 https select2 github io examples html插件使用Bulma http bulma io documentation elements form css框架 但前端看起来很混乱 我使
  • Gradle 编译依赖项未包含在 Jar 中

    我有一个 jar build plugins jar 其中包含一个 gradle 插件 该插件是在 build gradle 中使用此构建的 apply plugin java dependencies compile gradleApi
  • 服务器端 javascript - 经典 asp

    在客户端 JavaScript 中 this 运算符是窗口对象 经典 asp 服务器端 javascript 中的 this 运算符是什么 在下面的代码中 当在经典 ASP 服务器端运行时 this 引用是什么 test function
  • MySQL 版本与发行版号

    键入 mysql version 在 Linux shell 中执行命令 我得到以下信息 mysql Ver 14 12 Distrib 5 0 77 for redhat linux gnu i686 using readline 5 1
  • ANDROID - 使用 openCV 进行颜色检测 - 如何?

    我的目标是使用 HSV 颜色空间以仅显示黄色对象的方式显示脱粒图像 我使用这个代码 基于 openCV 2 3 1 android 示例给出的代码 protected Bitmap processFrame VideoCapture cap
  • 如何在 Refit 中禁用 urlencoding get-params?

    我使用 Refit 进行 RestAPI 我需要创建相同的查询字符串api item c 14 c 74 在改装界面中我创建了方法 Get item Task
  • Angular 2 Header组件标题根据状态动态变化

    我有一个使用 Angular 2 的设计 其中标题组件 导航栏组件和主体组件加载所有其他组件 如下图所示 Header 导航 其他组件加载的位置 此部分可能嵌套 组件 子组件 所以基本上 在标题组件中 我想显示当前状态 在当前状态的底部 我
  • OSX Lion 上的 SDL 与 g++

    有人知道如何在 OSX Lion 上设置 SDL 简单直接媒体层 以便我可以使用 g 编译我的代码吗 我已阅读该包附带的 自述文件 并将框架文件夹放置在相关目录中 但是 这似乎还不够 谁能帮我 我不想使用Xcode 如果您不使用 XCode
  • 新安装的 WAMP 中有奇怪的字符吗?

    我越来越奇怪的人物在我新安装的本地 WAMP 中 我刚刚从 ftp 在线下载了所有 php 文件 并在本地 mysql 服务器上恢复了备份 仅当文本包含以下内容时才会出现此问题符号或特殊字符 PHP MySQL 排序规则 latin1 sw
  • ThreadJob:无法从 BeginProcessing、... EndProcessing 方法的重写之外调用 WriteObject 和 WriteError?

    我已经安装了 ThreadJob 并且以下代码工作正常 commands r1 Start Sleep Seconds 3 r1 r2 Start Sleep Seconds 3 r2 jobs commands ForEach Objec
  • 为什么我的所有线程都使用 sleep() 进行睡眠?

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