C/C++编程:linux下多线程查看方法

线程测试程序

#include <iostream>
#include <thread>
#include <cstring>
#include <unistd.h>
#include <mutex>
using namespace std;


#define LEN 2
int num = 0;
std::mutex mt;
void run() {
    std::cout << "count = " << num << std::endl;

    std::this_thread::sleep_for(std::chrono::seconds(1));
    mt.lock();
    num-=1;
    mt.unlock();
}

int main() {

    while (true){
        while (num < LEN){
            mt.lock();
            num+=1;
            mt.unlock();

            std::thread t(run); //
            t.detach();
        }

    }

    return 0;
}

分析:在上面的程序中创建了两个线程,程序执行起来,main函数所在的程序为主线程,在这个主线程中有两个新的线程运行

ps:这个程序的名字叫做 hlog

如何命令行查询

1、查询当前程序的进程ID

# 查看当前程序的进程ID,是 89588  ,  23653 是父进程ID
$ ps -eaf |grep hlog|grep -v grep
oceanst+  89588  23653 99 15:43 ?        00:04:36 /home/oceanstar/CLionProjects/hlog/cmake-build-debug/hlog
# 或者 
$  ps -aux |grep hlog|grep -v grep
oceanst+  89588 99.8  0.0  39432  1220 ?        Rl   15:43   7:15 /home/oceanstar/CLionProjects/hlog/cmake-build-debug/hlog

2、 查看当前线程开启的进程数:

$ ps -eo ruser,pid,ppid,lwp,psr,args -L | grep hlog
oceanst+  89588  23653  89588   1 /home/oceanstar/CLionProjects/hlog/cmake-build-debug/hlog # 主
oceanst+  89588  23653  93099   0 /home/oceanstar/CLionProjects/hlog/cmake-build-debug/hlog # 从
oceanst+  89588  23653  93100   3 /home/oceanstar/CLionProjects/hlog/cmake-build-debug/hlog # 从
oceanst+  93102  25485  93102   2 grep --color=auto hlog   # 命令本身的线程

其中,每一列依次为:用户ID,进程ID,父进程ID,线程ID,运行该线程的CPU的序号,命令行参数(包括命令本身)。
# 查看status文件
$ cat /proc/89588/status
Name:	hlog   # 程序名称
State:	R (running)  # 运行状态
Pid:	89588    # 进程ID
PPid:	23653    # 父进程ID

Threads:	3  # 当前线程数【包括主线程】

# 或者查看sched文件
$ cat /proc/89588/sched
hlog (89588, #threads: 3)  第一行就指出了pid和总线程数。
-------------------------------------------------------------------
se.exec_start                                :      15487517.919034

查看线程的具体情况:task下是以线程id 值命名的目录,可以使用ls |wc 统计出的值和上面两种方式查出的结果一样。进入各线程id的目录,可以查看具体线程的资源信息。

$ ls /proc/89588/task
89588  94464  94465

注:上面查看文件的方法,主要是对单进程的线程统计。如像统计apache、nginx、zabbix这类程序会同时开启N个进程。如果要统计这类程序的线程数,就是所有进程下的线程数的之和。

3、查看主线程和新线程的关系

$ pstree -p 89588
hlog(89588)─┬─{hlog}(91010)
            └─{hlog}(91011)

4、线程栈结构的查看

pstack命令一般情况下用不到,其是一个栈跟踪的命令 。一般和 core dump和程序分析相关,也可以获取线程的详细信息。如:

$ pstack 线程ID

在这里插入图片描述

5、利用gdb查看线程信息

  • 将进程附加到gdb调试器当中,查看是否创建了新线程:gdb attach 主线程ID
$ gdb attach 主线程ID

在这里插入图片描述
*查询线程的一些信息

//1.查看进程:info inferiors
//2.查看线程:info threads
//3.查看线程栈结构:bt
//4.切换线程:thread n(n代表第几个线程)

在这里插入图片描述

* info threads: 显示当前可调试的所有线程,每个线程有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID 。前面的有*的是当前调试的线程
* thread ID: 切换为指定ID的线程

在这里插入图片描述

//1.设置断点:break 行号/函数名
//2.查看断点:info b

在这里插入图片描述

1.继续使某一线程运行:thread apply 1-n(第几个线程)n
2.重新启动陈故乡运行到断点处:r

**** 没有看完 ****


gdb调试

list

  • list命令显示多行源代码,从上次的位置开始显示,默认情况下,一次显示10行,第一次使用时,从代码起始位置显示
76      
77          NET_PARAM stuNetParam = {0};
78          stuNetParam.nGetDevInfoTime = 3000;
79          CLIENT_SetNetworkParam(&stuNetParam);
80      }
81      int main(int argc, char *argv[])
82      {
83         // LOG(INFO) << "=================================start========================================";
84         // init_HIK();
85           init_Dahua();
  • list n显示已第n行未中心的10行代码
(gdb) list 15
10      
11      INITIALIZE_EASYLOGGINGPP
12      map<string , TJKJ_PTZ_CONFIGS> dahua_camera_picture;
13      std::vector<TJKJ_PTZ_CONFIGS> success_camera_infos;
14      int run_number;
15      int this_camera_id = 0;
16      int end_success = 0;
17      time_t start_time;
18      time_t end_time;
19     
  • list functionname显示以functionname的函数为中心的10行代码
(gdb) list Init_db
151     
152         NET_DVR_Cleanup();
153         return 0;
154     }
155     
156     int Init_db(){
157         std::vector<TJKJ_PTZ_CONFIGS> Camera_Vector;
158         int init_mysql_statue = query_mysql_camera(Camera_Vector);
159         if (init_mysql_statue == 0){
160             LOG(INFO) << "db connection fail, exit";

list - 显示刚才打印过的源代码之前的代码

(gdb) list -
151     
152         NET_DVR_Cleanup();
153         return 0;
154     }
155     
156     int Init_db(){
157         std::vector<TJKJ_PTZ_CONFIGS> Camera_Vector;
158         int init_mysql_statue = query_mysql_camera(Camera_Vector);
159         if (init_mysql_statue == 0){
160             LOG(INFO) << "db connection fail, exit";

break

https://blog.csdn.net/zdy0_2004/article/details/80102076

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux下的多线程编程可以使用C/C++语言实现。C/C++语言提供了一些多线程编程的库,如pthread库、OpenMP库、Boost库等。其中,pthread库是Linux下最常用的多线程编程库,它提供了一系列的API函数,可以用来创建、管理和同步线程。在C/C++语言中,可以使用pthread_create()函数创建线程,使用pthread_join()函数等待线程结束,使用pthread_mutex_lock()和pthread_mutex_unlock()函数实现线程间的互斥访问等。同时,C++11标准也提供了一些多线程编程的支持,如std::thread类、std::mutex类等,可以方便地实现多线程编程。 ### 回答2: Linux下的多线程编程是指在Linux系统下使用多个线程来执行不同的任务,从而提高程序的运行效率和响应速度。 C/C++Linux下最常用的编程语言之一,也是多线程编程的主要语言。实现多线程编程可以使用线程库,其中最常用的是pthread库。 Pthread库是Linux下的开放式多线程库,它允许程序员使用标准的POSIX线程接口来创建、终止、同步和管理线程。使用Pthread库可以很方便地进行多线程编程,其中主要包括以下几个方面。 1. 创建和启动线程:使用pthread_create函数来创建和启动线程,该函数需要传递线程ID、线程属性和线程函数等参数。 2. 同步线程:使用pthread_join函数来等待一个线程结束,以便获取线程的返回值。使用pthread_mutex和pthread_cond等函数来进行线程同步。 3. 线程控制:使用pthread_cancel函数来取消线程,使用pthread_exit函数来终止线程。 4. 共享变量:在多个线程之间共享变量时,需要使用pthread_mutex和pthread_cond等函数来控制并发访问。 在进行多线程编程时,需要注意一些问题,如线程安全、死锁等问题。不同的线程对共享资源的读写需要使用同步机制,避免竞争和冲突。此外,要注意避免死锁,即多个线程互相等待对方释放资源,造成程序无法正常运行。 总之,Linux下的多线程编程是一项非常重要的技术,在实际开发中应用广泛。使用C/C++编写多线程程序,需要熟悉线程库的使用方法,掌握线程的创建、同步、控制和共享等技术,以保证程序的稳定性和运行效率。 ### 回答3: Linux是一种开源的操作系统,其多线程编程能力是其强大之处之一。当我们需要编写一个高性能、高并发的程序时,多线程编程无疑会是一个很好的选择。 在Linux下,C/C++是最常用的编程语言之一,也是多线程编程的重要语言之一。在C/C++中编写多线程程序主要依赖于pthread库。pthread库提供了一套多线程API,可以很方便的创建和管理线程。 使用pthread库创建线程需要以下步骤: 1. 包含pthread库头文件: #include <pthread.h> 2. 定义线程函数: void *thread_func(void *arg){ //线程执行的代码 } 3. 创建线程: pthread_t tid; pthread_create(&tid, NULL, thread_func, NULL); 4. 等待线程结束: pthread_join(tid, NULL); 以上代码片段就创建了一个新线程,并在新线程中执行了thread_func函数。pthread_create函数的第一个参数为线程ID,第二个参数为线程属性,一般使用NULL,第三个参数为线程函数,第四个参数为线程函数的参数。 多线程编程需要注意以下几点: 1. 线程安全:多个线程同时操作同一个共享资源,需要确保操作的正确性和安全性。 2. 线程同步:使用锁、互斥量等机制保证线程之间的同步。 3. 线程调度:多个线程之间需要进行调度,需要注意线程优先级的设置。 总之,在Linux下使用C/C++进行多线程编程是一项非常有用的技能。在实际开发中,需要结合具体的场景和需求,通过选择合适的多线程编程模型、算法和数据结构来实现高效、高性能的程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值