嵌入式与Linux(五):Linux线程

嵌入式与Linux(五):Linux线程,第1张

姓名:王央京    学号:18050100052   学院:电子工程学院

转自:>

线程创建

函数原型:intpthread_create(pthread_trestrict tidp,const pthread_attr_t restrict attr,void (start_rtn)(void),void restrict arg);

返回值:若是成功建立线程返回0,否则返回错误的编号。

形式参数:pthread_trestrict tidp要创建的线程的线程id指针;const pthread_attr_t restrict attr创建线程时的线程属性;void (start_rtn)(void)返回值是void类型的指针函数;void restrict arg start_rtn的形参。

线程挂起:该函数的作用使得当前线程挂起,等待另一个线程返回才继续执行。也就是说当程序运行到这个地方时,程序会先停止,然后等线程id为thread的这个线程返回,然后程序才会断续执行。

函数原型:intpthread_join(pthread_tthread, void value_ptr);

参数说明如下:thread等待退出线程的线程号;value_ptr退出线程的返回值。

返回值:若成功,则返回0;若失败,则返回错误号。

线程退出

函数原型:voidpthread_exit(void rval_ptr);

获取当前线程id

函数原型:pthread_tpthread_self(void);

互斥锁

创建pthread_mutex_init;销毁pthread_mutex_destroy;加锁pthread_mutex_lock;解锁pthread_mutex_unlock。

条件锁

创建pthread_cond_init;销毁pthread_cond_destroy;触发pthread_cond_signal;广播pthread_cond_broadcast;等待pthread_cond_wait。

先用ps看目前存在的所有进程的进程号,然后可以对具体进程采用以下这些 *** 作:(11345就是对应具体的进程号)

只查看该进程:ps -ef | grep 11345

查看该进程打开的文件:lsof -p 11345

查看内存分配:lcat /proc/11345/maps

查看堆栈:pstack 11345

查看发出的系统调用:strace -p 11345

查看调用库函数:ltrace -p 11345

可以用下面的命令将 cpu 占用率高的线程找出来:

ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu

这个命令首先指定参数'H',显示线程相关的信息,格式输出中包含:user,pid,ppid,tid,time,%cpu,cmd,然后再用%cpu字段进行排序。这样就可以找到占用处理器的线程了。

直接使用 ps Hh -eo pid,tid,pcpu | sort -nk3 |tail 获取对于的进程号和线程号,然后跳转到3

查看哪个进程线程占用cpu过高; top / ps -aux, 获得进程号

确定哪个线程占用cpu过高,进入进程号的目录:/proc/pid/task,

执行:grep SleepAVG /status | sort -k2,2 | head, 确定cpu占用较高的线程号。

使用kill -3 pid 会打印线程堆栈的情况

OpenMP的嵌套并行在默认情况下为false。

假如有第一层(外层)、第二层(内层)两层并行,默认情况下,第一层并行制导语句会创建线程组,将外层循环实现线程并行化,但第二层制导语句不会创建多个线程,而是将其所包含的代码会在外层线程组中的每一个线程里串行执行。

如外层的0号线程执行到内层并行制导语句处,在0号线程内不会再创建多个线程的线程组,而是以一个线程串行执行,即0号线程内的主线程,其线程号也为0;

同理,如外层的1号线程执行到内层并行制导语句处,在1号线程内不会再创建多个线程的线程组,而是以一个线程串行执行,即1号线程内的主线程,其线程号也为0;

你把获取线程号的库函数OMP_GET_THREAD_NUM()放在内层循环,这样默认情况下其获得的线程号永远都是0。

实现并行嵌套的方法

若要并行区域A内可以再嵌套并行区域B,需要在并行区域A外面激活并行嵌套,如下:

OMP_set_nested(1)

!$OMP PARALLEL DO

     DO I=1,10

!$OMP PARALLEL DO

        DO J=1,10

     WRITE(,10)I,J,OMP_GET_THREAD_NUM()

10    FORMAT(1X,'I=',I2,'J=',I2,'ID=',I3)

        ENDDO

!$OMP END PARALLEL DO

     ENDDO

!$OMP END PARALLEL DO

以上就是关于嵌入式与Linux(五):Linux线程全部的内容,包括:嵌入式与Linux(五):Linux线程、如何在 Linux 上查找哪个线程cpu利用率最高、C语言多线程的 *** 作步骤等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9583185.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存