linux线程调用命令 linux线程相关函数

利用linux命令如何查进程中有多少线程1 。使用top命令 , 具体用法是 top -H
加上这个选项,top的每一行就不是显示一个进程 , 而是一个线程 。
2 。使用ps命令,具体用法是 ps -xH
这样可以查看所有存在的线程 , 也可以使用grep作进一步的过滤 。
3 。使用ps命令,具体用法是 ps -mq PID
这样可以看到指定的进程产生的线程数目 。
更进一步,其实一些系统监控工具,在本质上也是读取的系统产生的文件罢了 。比如说进程这个事情,
看看这个目录吧 , /proc/5000/ 这里面有你所有想要的 。其实stat代表着当前的一些信息 。
使用ps命令来查看进程的时候 , 进程状态分别对应的含义如下:
D 不可中断睡眠 (通常是在IO操作) 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生
R 正在运行或可运行(在运行队列排队中)
S 可中断睡眠 (休眠中, 受阻, 在等待某个条件的形成或接受到信号)
T 已停止的 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行
W 正在换页(2.6.内核之前有效)
X 死进程 (未开启)
Z 僵尸进程 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放BSD风格的
高优先级(not nice to other users)
N 低优先级(nice to other users)
L 页面锁定在内存(实时和定制的IO)
s 一个信息头
l 多线程(使用 CLONE_THREAD,像NPTL的pthreads的那样)
在前台进程组
linux下的命令都是干什么用的?前三个和最后一个是两个类型 。前三个主要是Linux用来创建新的进程(线程)而设计的,exec()系列函数则是用来用指定的程序替换当前进程的所有内容 。所以exec()系列函数经常在前三个函数使用之后调用,来创建一个全新的程序运行环境 。Linux用init进程启动其他进程的过程一般都是这样的 。
下面说fork、vfork和clone三个函数 。这三个函数分别调用了sys_fork、sys_vfork、sys_clone,最终都调用了do_fork函数 , 差别在于参数的传递和一些基本的准备工作不同 。可见这三者最终达到的最本质的目的都是创建一个新的进程 。在这里需要明确一下,Linux内核中没有独立的“线程”结构,Linux的线程就是轻量级进程,换言之基本控制结构和Linux的进程是一样的(都是通过struct task_struct管理) 。
fork是最简单的调用,不需要任何参数,仅仅是在创建一个子进程并为其创建一个独立于父进程的空间 。fork使用COW(写时拷贝)机制 , 并且COW了父进程的栈空间 。
vfork是一个过时的应用,vfork也是创建一个子进程,但是子进程共享父进程的空间 。在vfork创建子进程之后,父进程阻塞 , 直到子进程执行了exec()或者exit() 。vfork最初是因为fork没有实现COW机制,而很多情况下fork之后会紧接着exec,而exec的执行相当于之前fork复制的空间全部变成了无用功,所以设计了vfork 。而现在fork使用了COW机制,唯一的代价仅仅是复制父进程页表的代价,所以vfork不应该出现在新的代码之中 。在Linux的manpage中队vfork有这样一段话:Itis rather unfortunate that Linux revived this specter from the past.The BSD man page states: "This system call will be eliminated when proper system sharing mechanisms are implemented.Users should not depend on the memory sharing semantics of vfork() as it will, in that case, be made synonymous to fork(2)."
clone是Linux为创建线程设计的(虽然也可以用clone创建进程) 。所以可以说clone是fork的升级版本,不仅可以创建进程或者线程,还可以指定创建新的命名空间(namespace)、有选择的继承父进程的内存、甚至可以将创建出来的进程变成父进程的兄弟进程等等 。clone和fork的调用方式也很不相同,clone调用需要传入一个函数 , 该函数在子进程中执行 。此外,clone和fork最大不同在于clone不再复制父进程的栈空间,而是自己创建一个新的 。
关于Linux命令的介绍,看看《linux就该这么学》,具体关于这一章地址3w(dot)linuxprobe/chapter-02(dot)html
linux下 c 语言线程池怎么调用1使用线程池的原因
通常使用多线程都是在需要的时候创建一个新的线程,然后执行任务,完成后退出 。一般情况下是完全够满足我们的程序的 。
但是当我们需要创建大量的线程,并且执行一个简单的任务之后销毁,比如:在web,email,db里面的一些应用 , 如彩铃,或者网络通信编程,或者云计算里面后台镜像处理的时候,我们的应用在任何时候都要准备面对数目巨大的连接请求,同时 , 这些请求执行的任务却又比较简单,占用的时间很少,这样我们可能就会处于不停的创建线程并销毁线程的状态 。虽说比起进程的创建,线程的创建时间已经大大缩短,但是如果需要频繁的创建线程 , 并且每个线程所占用的处理时间又非常简短,则线程创建和销毁带给处理器的额外负担也是很可观的 。
线程池的作用正是在这种情况下有效的降低频繁创建销毁线程所带来的额外开销 。一般来说,线程池都是采用预创建的技术,在应用启动之初便预先创建一定数目的线程 。应用在运行的过程中 , 需要时可以从这些线程所组成的线程池里申请分配一个空闲的线程,来执行一定的任务,任务完成后,并不是将线程销毁,而是将它返还给线程池,由线程池自行管理 。如果线程池中预先分配的线程已经全部分配完毕,但此时又有新的任务请求,则线程池会动态的创建新的线程去适应这个请求 。当然,有可能 , 某些时段应用并不需要执行很多的任务,导致了线程池中的线程大多处于空闲的状态 , 为了节省系统资源 , 线程池就需要动态的销毁其中的一部分空闲线程 。因此 , 线程池都需要一个管理者,按照一定的要求去动态的维护其中线程的数目 。
当然 , 如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了 。
Linux线程及同步linux多线程
1.线程概述
线程是一个进程内的基本调度单位 , 也可以称为轻量级进程 。线程是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理 。因此,大大减少了上下文切换的开销 。一个进程可以有多个线程,也就
是有多个线程控制表及堆栈寄存器,但却共享一个用户地址空间 。
2.线程实现
线程创建pthread_create()
所需头文件#include
pthread.h
函数原型int
pthread_create
((pthread_t
*thread,
pthread_attr_t
*attr,
thread:线程标识符
attr:线程属性设置
start_routine:线程函数的起始地址
arg:传递给start_routine的参数
函数返回值
成功:0
出错:-1
线程退出pthread_exit();
所需头文件#include
pthread.h
函数原型void
pthread_exit(void
*retval)
函数传入值retval:pthread_exit()调用者线程的返回值 , 可由其他函数如pthread_join
来检索获取
等待线程退出并释放资源pthread_join()
所需头文件#include
pthread.h
函数原型int
pthread_join
((pthread_t
th,
void
**thread_return))
函数传入值
th:等待线程的标识符
thread_return:用户定义的指针,用来存储被等待线程的返回值(不为NULL时)
函数返回值
成功:0
出错:-1
代码举例
1.
#includepthread.h
2.
#includestdio.h
3.
#includeerrno.h
4.
5.
/*线程1*/
6.
void
thread1()
7.
{
8.
int
i=0;
9.
10.
while(1)
11.
{
12.
printf(thread1:%d/n,i);
13.
if(i3)
14.
pthread_exit(0);
15.
i;
16.
sleep(1);
17.
}
18.
}
19.
20.
/*线程2*/
21.
void
thread2()
22.
{
23.
int
i=0;
24.
25.
while(1)
26.
{
27.
printf(thread2:%d/n,i);
28.
if(i5)
29.
pthread_exit(0);
30.
i;
31.
sleep(1);
32.
}
33.
}
34.
35.
int
main()
36.
{
37.
pthread_t
t1,t2;
38.
39.
/*创建线程*/
40.
pthread_create(t1,NULL,(void
*)thread1,NULL);
41.
pthread_create(t2,NULL,(void
*)thread2,NULL);
42.
/*等待线程退出*/
43.
pthread_join(t1,NULL);
44.
pthread_join(t2,NULL);
45.
return
0;
46.
}
3同步与互斥
1互斥锁
互斥锁的操作主要包括以下几个步骤 。
?
互斥锁初始化:pthread_mutex_init
?
互斥锁上锁:pthread_mutex_lock
?
互斥锁判断上锁:pthread_mutex_trylock
?
互斥锁接锁:pthread_mutex_unlock
?
消除互斥锁:pthread_mutex_destroy
1.
#includepthread.h
2.
#includestdio.h
3.
#includeerrno.h
4.
5.
int
i=0;/*共享变量*/
6.
pthread_mutex_t
mutex=PTHREAD_MUTEX_INITIALIZER;/*互斥锁*/
7.
8.
void
thread1()
9.
{
10.
int
ret;
11.
while(1)
12.
{
13.
14.
15.
ret=pthread_mutex_trylock(mutex);/*判断上锁*/
16.
17.
if(ret!=EBUSY)
18.
{
19.
pthread_mutex_lock(mutex);/*上锁*/
20.
printf(This
is
thread1:%d/n,i);
21.
i;
22.
pthread_mutex_unlock(mutex);/*解锁*/
23.
}
24.
sleep(1);
25.
}
26.
}
27.
28.
void
thread2()
29.
{int
ret;
30.
while(1)
31.
{
32.
33.
ret=pthread_mutex_trylock(mutex);
34.
if(ret!=EBUSY)
35.
{
36.
pthread_mutex_lock(mutex);
37.
printf(This
is
thread2:%d/n,i);
38.
i;
39.
pthread_mutex_unlock(mutex);
40.
}
41.
sleep(1);
42.
}
43.
}
44.
int
main()
45.
{
46.
pthread_t
t1,t2;
47.
pthread_mutex_init(mutex,NULL);
48.
pthread_create(t1,NULL,(void
*)thread1,NULL);
49.
pthread_create(t2,NULL,(void
*)thread2,NULL);
50.
【linux线程调用命令 linux线程相关函数】51.
pthread_join(t1,NULL);
52.
pthread_join(t2,NULL);
53.
54.
pthread_mutex_destroy(mutex);
55.
return
0;
56.
}
2信号量
未进行同步处理的两个线程
1.
#includepthread.h
2.
#includestdio.h
3.
#includeerrno.h
4.
5.
int
i=0;
6.
void
thread1()
7.
{
8.
9.
while(1)
10.
{
11.
printf(This
is
thread1:%d/n,i);
12.
i;
13.
sleep(1);
14.
}
15.
}
16.
17.
18.
void
thread2()
19.
{
20.
21.
while(1)
22.
{
23.
printf(This
is
thread2:%d/n,i);
24.
i;
25.
sleep(1);
26.
}
27.
}
28.
29.
int
main()
30.
{
31.
pthread_t
t1,t2;
32.
33.
pthread_create(t1,NULL,(void
*)thread1,NULL);
34.
pthread_create(t2,NULL,(void
*)thread2,NULL);
linux线程调用命令的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux线程相关函数、linux线程调用命令的信息别忘了在本站进行查找喔 。

    推荐阅读