pthread 编程
文章目录
- pthread api
- 创建线程终止线程
- 线程管理
- 栈管理
- 其它
- 互斥量
- 创建与销毁互斥量
- 锁定与解锁互斥量
- 条件变量
- 创建与销毁条件变量
- 等待与通知
- 所有库函数
pthread api
对 pthread api 进行归类, 可以分为四类:
线程管理
直接工作于线程, 如创建, 分离, 加入 (join) 等, 也包括设置或查询线程属性
(joinable, scheduling 等).互斥量
处理同步的 mutex (mutual exclusion 的缩写), 如创建互斥量, 销毁互斥量,
锁定及解锁互斥量等, 也包括互斥量属性的设置与修改.条件变量
处理线程之间的通信, 这些共享同一个 mutex, 如创建, 销毁, 等待, 通知
(singal), 也包括设置或查询条件变量的属性.同步
管理读写锁和栅栏 (barrier).
pthread 库中所有的标识都以 pthread_ 开头, 如下表所示:
前缀 | 分组 |
---|---|
pthread_ | 与线程本身相关的指令组 |
pthread_attr_ | 线程属性对象 |
pthread_mutex_ | 互斥量s |
pthread_mutexattr_ | 互斥量属性对象 |
pthread_cond_ | 条件变量 |
pthread_condattr_ | 条件变量属性对象 |
pthread_key_ | 特定于线程的数据 keys (局部存储) |
pthread_rwlock_ | 读写锁 |
pthread_barrier_ | 同步栅栏 |
创建线程终止线程
主要有下列的 api:
// 若 arg 为 NULL, 表示不向 start_routine() 传递参数
int pthread_create(pthread_t *restrict thread,const pthread_attr_t *restrict attr,void *(*start_routine)(void*),void *restrict arg);// value_ptr 为线程退出码, 由 pthread_join() 函数的第二个参数接收.
// 在 main() 中创建了线程, 然后显式调用本函数, main() 会等其它线程
//+都结束后才会结束.
void pthread_exit(void *value_ptr);int pthread_cancel(pthread_t thread);int pthread_attr_destroy(pthread_attr_t *attr);int pthread_attr_init(pthread_attr_t *attr);
例 1: Pthread Creation and Termination
#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS 5void *PrintHello(void *threadid)
{long tid;tid = (long)threadid;printf("Hello World! It's me, thread #%ld!\n", tid);pthread_exit(NULL);
}int main (int argc, char *argv[])
{pthread_t threads[NUM_THREADS];int rc;long t;for(t=0; t<NUM_THREADS; t++){printf("In main: creating thread %ld\n", t);rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);if (rc){printf("ERROR; return code from pthread_create() is %d\n", rc);exit(-1);}}pthread_exit(NULL);
}
例2: Thread Argument Passing
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 8char *messages[NUM_THREADS];void *PrintHello(void *threadid)
{int *id_ptr, taskid;sleep(1);id_ptr = (int *) threadid;taskid = *id_ptr;printf("Thread %d: %s\n", taskid, messages[taskid]);pthread_exit(NULL);
}int main(int argc, char *argv[])
{pthread_t threads[NUM_THREADS];int *taskids[NUM_THREADS];int rc, t;messages[0] = "English: Hello World!";messages[1] = "French: Bonjour, le monde!";messages[2] = "Spanish: Hola al mundo";messages[3] = "Klingon: Nuq neH!";messages[4] = "German: Guten Tag, Welt!";messages[5] = "Russian: Zdravstvytye, mir!";messages[6] = "Japan: Sekai e konnichiwa!";messages[7] = "Latin: Orbis, te saluto!";for(t=0;t<NUM_THREADS;t++) {taskids[t] = (int *) malloc(sizeof(int));*taskids[t] = t;printf("Creating thread %d\n", t);rc = pthread_create(&threads[t], NULL, PrintHello, (void *) taskids[t]);if (rc) {printf("ERROR; return code from pthread_create() is %d\n", rc);exit(-1);}}pthread_exit(NULL);
}
例3: Thread Argument Passing
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 8char *messages[NUM_THREADS];struct thread_data
{int thread_id;int sum;char *message;
};struct thread_data thread_data_array[NUM_THREADS];void *PrintHello(void *threadarg)
{int taskid, sum;char *hello_msg;struct thread_data *my_data;sleep(1);my_data = (struct thread_data *) threadarg;taskid = my_data->thread_id;sum = my_data->sum;hello_msg = my_data->message;printf("Thread %d: %s Sum=%d\n", taskid, hello_msg, sum);pthread_exit(NULL);
}int main(int argc, char *argv[])
{pthread_t threads[NUM_THREADS];int *taskids[NUM_THREADS];int rc, t, sum;sum=0;messages[0] = "English: Hello World!";messages[1] = "French: Bonjour, le monde!";messages[2] = "Spanish: Hola al mundo";messages[3] = "Klingon: Nuq neH!";messages[4] = "German: Guten Tag, Welt!";messages[5] = "Russian: Zdravstvytye, mir!";messages[6] = "Japan: Sekai e konnichiwa!";messages[7] = "Latin: Orbis, te saluto!";for(t=0;t<NUM_THREADS;t++) {sum = sum + t;thread_data_array[t].thread_id = t;thread_data_array[t].sum = sum;thread_data_array[t].message = messages[t];printf("Creating thread %d\n", t);rc = pthread_create(&threads[t], NULL, PrintHello,(void *) &thread_data_array[t]);if (rc) {printf("ERROR; return code from pthread_create() is %d\n", rc);exit(-1);}}pthread_exit(NULL);
}
线程管理
主要有下面 api:
// value_ptr 由 pthread_exit() 指定.
int pthread_join(pthread_t thread, void **value_ptr);int pthread_detach(pthread_t thread);int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
例 4: Pthread Joining
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NUM_THREADS 4void *BusyWork(void *t)
{int i;long tid;double result=0.0;tid = (long)t;printf("Thread %ld starting...\n",tid);for (i=0; i<1000000; i++){result = result + sin(i) * tan(i);}printf("Thread %ld done. Result = %e\n",tid, result);pthread_exit((void*) t);
}int main (int argc, char *argv[])
{pthread_t thread[NUM_THREADS];pthread_attr_t attr;int rc;long t;void *status;pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);for(t=0; t<NUM_THREADS; t++) {printf("Main: creating thread %ld\n", t);rc = pthread_create(&thread[t], &attr, BusyWork, (void *)t);if (rc) {printf("ERROR; return code from pthread_create()is %d\n", rc);exit(-1);}}pthread_attr_destroy(&attr);for(t=0; t<NUM_THREADS; t++) {rc = pthread_join(thread[t], &status);if (rc) {printf("ERROR; return code from pthread_join()is %d\n", rc);exit(-1);}printf("Main: completed join with thread %ld having a statusof %ld\n",t,(long)status);}printf("Main: program completed. Exiting.\n");pthread_exit(NULL);
}
栈管理
不同的操作系统可以为线栈提供的栈大小不一样, 可以人为指定线程使用的栈大小
(要考虑操作系统的限制). 主要有下面的 api:
int pthread_attr_getstacksize(const pthread_attr_t *restrict attr,size_t *restrict stacksize);int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);int pthread_attr_getstackaddr(const pthread_attr_t *restrict attr,void **restrict stackaddr);int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);
例 5: Stack Management
#include <pthread.h>
#include <stdio.h>
#define NTHREADS 4
#define N 1000
#define MEGEXTRA 1000000pthread_attr_t attr;void *dowork(void *threadid)
{double A[N][N];int i,j;long tid;size_t mystacksize;tid = (long)threadid;pthread_attr_getstacksize (&attr, &mystacksize);printf("Thread %ld: stack size = %li bytes \n", tid, mystacksize);for (i=0; i<N; i++)for (j=0; j<N; j++)A[i][j] = ((i*j)/3.452) + (N-i);pthread_exit(NULL);
}int main(int argc, char *argv[])
{pthread_t threads[NTHREADS];size_t stacksize;int rc;long t;pthread_attr_init(&attr);pthread_attr_getstacksize (&attr, &stacksize);printf("Default stack size = %li\n", stacksize);stacksize = sizeof(double)*N*N+MEGEXTRA;printf("Amount of stack needed per thread = %li\n",stacksize);pthread_attr_setstacksize (&attr, stacksize);printf("Creating threads with stack size = %li bytes\n",stacksize);for(t=0; t<NTHREADS; t++){rc = pthread_create(&threads[t], &attr, dowork, (void *)t);if (rc){printf("ERROR; return code from pthread_create() is %d\n", rc);exit(-1);}}printf("Created %ld threads.\n", t);pthread_exit(NULL);
}
其它
pthread_t pthread_self(void);int pthread_equal(pthread_t t1, pthread_t t2);// 这是静态声明
pthread_once_t once_control = PTHREAD_ONCE_INIT;int pthread_once(pthread_once_t *once_control,void (*init_routine)(void));
互斥量
创建与销毁互斥量
主要有下面 api:
// 这是静态声明
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;int pthread_mutex_destroy(pthread_mutex_t *mutex);int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);int pthread_mutexattr_init(pthread_mutexattr_t *attr);
锁定与解锁互斥量
主要有下面 api:
int pthread_mutex_lock(pthread_mutex_t *mutex);int pthread_mutex_trylock(pthread_mutex_t *mutex);int pthread_mutex_unlock(pthread_mutex_t *mutex);
例 6: Using Mutexes
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>typedef struct
{double *a;double *b;double sum;int veclen;
} DOTDATA;#define NUMTHRDS 4
#define VECLEN 100DOTDATA dotstr;
pthread_t callThd[NUMTHRDS];
pthread_mutex_t mutexsum;void *dotprod(void *arg)
{int i, start, end, len ;long offset;double mysum, *x, *y;offset = (long)arg;len = dotstr.veclen;start = offset*len;end = start + len;x = dotstr.a;y = dotstr.b;mysum = 0;for (i=start; i<end ; i++) {mysum += (x[i] * y[i]);}pthread_mutex_lock (&mutexsum);dotstr.sum += mysum;pthread_mutex_unlock (&mutexsum);pthread_exit((void*) 0);
}int main (int argc, char *argv[])
{long i;double *a, *b;void *status;pthread_attr_t attr;a = (double*) malloc (NUMTHRDS*VECLEN*sizeof(double));b = (double*) malloc (NUMTHRDS*VECLEN*sizeof(double));for (i=0; i<VECLEN*NUMTHRDS; i++) {a[i]=1.0;b[i]=a[i];}dotstr.veclen = VECLEN;dotstr.a = a;dotstr.b = b;dotstr.sum=0;pthread_mutex_init(&mutexsum, NULL);pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);for(i=0; i<NUMTHRDS; i++) {pthread_create(&callThd[i], &attr, dotprod, (void *)i);}pthread_attr_destroy(&attr);for(i=0; i<NUMTHRDS; i++) {pthread_join(callThd[i], &status);}printf ("Sum = %f \n", dotstr.sum);free (a);free (b);pthread_mutex_destroy(&mutexsum);pthread_exit(NULL);
}
条件变量
创建与销毁条件变量
主要有下面 api:
// 这是静态声明
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;int pthread_cond_destroy(pthread_cond_t *cond);int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);int pthread_condattr_destroy(pthread_condattr_t *attr);int pthread_condattr_init(pthread_condattr_t *attr);
等待与通知
主要有下面 api:
int pthread_cond_timedwait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,const struct timespec *restrict abstime);int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);int pthread_cond_broadcast(pthread_cond_t *cond);int pthread_cond_signal(pthread_cond_t *cond);int pthread_cond_broadcast(pthread_cond_t *cond);int pthread_cond_signal(pthread_cond_t *cond);
例 7: Using Condition Variables
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>#define NUM_THREADS 3
#define TCOUNT 10
#define COUNT_LIMIT 12int count = 0;
int thread_ids[3] = {0,1,2};
pthread_mutex_t count_mutex;
pthread_cond_t count_threshold_cv;void *inc_count(void *t)
{int i;long my_id = (long)t;for (i=0; i<TCOUNT; i++) {pthread_mutex_lock(&count_mutex);count++;if (count == COUNT_LIMIT) {pthread_cond_signal(&count_threshold_cv);printf("inc_count(): thread %ld, count = %d Threshold reached.\n",my_id, count);}printf("inc_count(): thread %ld, count = %d, unlocking mutex\n",my_id, count);pthread_mutex_unlock(&count_mutex);sleep(1);}pthread_exit(NULL);}void *watch_count(void *t)
{long my_id = (long)t;printf("Starting watch_count(): thread %ld\n", my_id);pthread_mutex_lock(&count_mutex);while (count<COUNT_LIMIT) {pthread_cond_wait(&count_threshold_cv, &count_mutex);printf("watch_count(): thread %ld Condition signal received.\n", my_id);count += 125;printf("watch_count(): thread %ld count now = %d.\n", my_id, count);}pthread_mutex_unlock(&count_mutex);pthread_exit(NULL);
}int main (int argc, char *argv[])
{int i, rc;long t1=1, t2=2, t3=3;pthread_t threads[3];pthread_attr_t attr;pthread_mutex_init(&count_mutex, NULL);pthread_cond_init (&count_threshold_cv, NULL);pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);pthread_create(&threads[0], &attr, watch_count, (void *)t1);pthread_create(&threads[1], &attr, inc_count, (void *)t2);pthread_create(&threads[2], &attr, inc_count, (void *)t3);for (i=0; i<NUM_THREADS; i++) {pthread_join(threads[i], NULL);}printf ("Main(): Waited on %d threads. Done.\n", NUM_THREADS);/* Clean up and exit */pthread_attr_destroy(&attr);pthread_mutex_destroy(&count_mutex);pthread_cond_destroy(&count_threshold_cv);pthread_exit(NULL);}
所有库函数
int pthread_atfork (void (*prepare)(void),void (*parent)(void),void (*child)(void));int pthread_attr_destroy (pthread_attr_t *attr);int pthread_attr_getdetachstate (const pthread_attr_t *attr,int *detachstate);int pthread_attr_getguardsize (const pthread_attr_t *restrict attr,size_t *restrict guardsize);int pthread_attr_getinheritsched (const pthread_attr_t *restrict attr,int *restrict inheritsched);int pthread_attr_getschedparam (const pthread_attr_t *restrict attr,struct sched_param *restrict param);int pthread_attr_getschedpolicy (const pthread_attr_t *restrict attr,int *restrict policy);int pthread_attr_getscope (const pthread_attr_t *restrict attr,int *restrict contentionscope);int pthread_attr_getstack (const pthread_attr_t *restrict attr,void **restrict stackaddr,size_t *restrict stacksize);int pthread_attr_getstackaddr (const pthread_attr_t *restrict attr,void **restrict stackaddr);int pthread_attr_getstacksize (const pthread_attr_t *restrict attr,size_t *restrict stacksize);int pthread_attr_init (pthread_attr_t *attr);int pthread_attr_setdetachstate (pthread_attr_t *attr,int detachstate);int pthread_attr_setguardsize (pthread_attr_t *attr,size_t guardsize);int pthread_attr_setinheritsched (pthread_attr_t *attr,int inheritsched);int pthread_attr_setschedparam (pthread_attr_t *restrict attr,const struct sched_param *restrict param);int pthread_attr_setschedpolicy (pthread_attr_t *attr,int policy);int pthread_attr_setscope (pthread_attr_t *attr,int contentionscope);int pthread_attr_setstack (pthread_attr_t *attr,void *stackaddr,size_t stacksize);int pthread_attr_setstackaddr (pthread_attr_t *attr,void *stackaddr);int pthread_attr_setstacksize (pthread_attr_t *attr,size_t stacksize);int pthread_barrier_destroy (pthread_barrier_t *barrier);int pthread_barrier_init (pthread_barrier_t *restrict barrier,const pthread_barrierattr_t *restrict attr,unsigned count);int pthread_barrier_wait (pthread_barrier_t *barrier);int pthread_barrierattr_destroy (pthread_barrierattr_t *attr);int pthread_barrierattr_getpshared (const pthread_barrierattr_t * restrict attr,int *restrict pshared);int pthread_barrierattr_init (pthread_barrierattr_t *attr);int pthread_barrierattr_setpshared (pthread_barrierattr_t *attr,int pshared);int pthread_cancel (pthread_t thread);int pthread_cond_broadcast (pthread_cond_t *cond);int pthread_cond_destroy (pthread_cond_t *cond);int pthread_cond_init (pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);int pthread_cond_signal (pthread_cond_t *cond);int pthread_cond_timedwait (pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,const struct timespec *restrict abstime);int pthread_cond_wait (pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);int pthread_condattr_destroy (pthread_condattr_t *attr);int pthread_condattr_getclock (const pthread_condattr_t *restrict attr,clockid_t *restrict clock_id);int pthread_condattr_getpshared (const pthread_condattr_t *restrict attr,int *restrict pshared);int pthread_condattr_init (pthread_condattr_t *attr);int pthread_condattr_setclock (pthread_condattr_t *attr,clockid_t clock_id);int pthread_condattr_setpshared (pthread_condattr_t *attr,int pshared);int pthread_create (pthread_t *restrict thread,const pthread_attr_t *restrict attr,void *(*start_routine)(void*),void *restrict arg);int pthread_detach (pthread_t thread);int pthread_equal (pthread_t t1,pthread_t t2);int pthread_getconcurrency (void);int pthread_getcpuclockid (pthread_t thread_id,clockid_t *clock_id);int pthread_getschedparam (pthread_t thread,int *restrict policy,struct sched_param *restrict param);int pthread_join (pthread_t thread,void **value_ptr);int pthread_key_create (pthread_key_t *key,void (*destructor)(void*));int pthread_key_delete (pthread_key_t key);int pthread_kill (pthread_t thread,int sig);int pthread_mutex_destroy (pthread_mutex_t *mutex);int pthread_mutex_getprioceiling (const pthread_mutex_t *restrict mutex,int *restrict prioceiling);int pthread_mutex_init (pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);int pthread_mutex_lock (pthread_mutex_t *mutex);int pthread_mutex_setprioceiling (pthread_mutex_t *restrict mutex,int prioceiling,int *restrict old_ceiling);int pthread_mutex_timedlock (pthread_mutex_t *restrict mutex,const struct timespec *restrict abs_timeout);int pthread_mutex_trylock (pthread_mutex_t *mutex);int pthread_mutex_unlock (pthread_mutex_t *mutex);int pthread_mutexattr_destroy (pthread_mutexattr_t *attr);int pthread_mutexattr_getprioceiling (const pthread_mutexattr_t * restrict attr,int *restrict prioceiling);int pthread_mutexattr_getprotocol (const pthread_mutexattr_t * restrict attr,int *restrict protocol);int pthread_mutexattr_getpshared (const pthread_mutexattr_t * restrict attr,int *restrict pshared);int pthread_mutexattr_gettype (const pthread_mutexattr_t *restrict attr,int *restrict type);int pthread_mutexattr_init (pthread_mutexattr_t *attr);int pthread_mutexattr_setprioceiling (pthread_mutexattr_t *attr,int prioceiling);int pthread_mutexattr_setprotocol (pthread_mutexattr_t *attr,int protocol);int pthread_mutexattr_setpshared (pthread_mutexattr_t *attr,int pshared);int pthread_mutexattr_settype (pthread_mutexattr_t *attr,int type);int pthread_once (pthread_once_t *once_control,void (*init_routine)(void));int pthread_rwlock_destroy (pthread_rwlock_t *rwlock);int pthread_rwlock_init (pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr);int pthread_rwlock_rdlock (pthread_rwlock_t *rwlock);int pthread_rwlock_timedrdlock (pthread_rwlock_t *restrict rwlock,const struct timespec *restrict abs_timeout);int pthread_rwlock_timedwrlock (pthread_rwlock_t *restrict rwlock,const struct timespec *restrict abs_timeout);int pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock);int pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock);int pthread_rwlock_unlock (pthread_rwlock_t *rwlock);int pthread_rwlock_wrlock (pthread_rwlock_t *rwlock);int pthread_rwlockattr_destroy (pthread_rwlockattr_t *attr);int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * restrict attr,int *restrict pshared);int pthread_rwlockattr_init (pthread_rwlockattr_t *attr);int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr,int pshared);int pthread_setcancelstate (int state,int *oldstate);int pthread_setcanceltype (int type,int *oldtype);int pthread_setconcurrency (int new_level);int pthread_setschedparam (pthread_t thread,int policy,const struct sched_param *param);int pthread_setschedprio (pthread_t thread,int prio);int pthread_setspecific (pthread_key_t key,const void *value);int pthread_sigmask (int how,const sigset_t *restrict set,sigset_t *restrict oset);int pthread_spin_destroy (pthread_spinlock_t *lock);int pthread_spin_init (pthread_spinlock_t *lock,int pshared);int pthread_spin_lock (pthread_spinlock_t *lock);int pthread_spin_trylock (pthread_spinlock_t *lock);int pthread_spin_unlock (pthread_spinlock_t *lock);int sigprocmask (int how,const sigset_t *restrict set,sigset_t *restrict oset);pthread_t pthread_self (void);void *pthread_getspecific (pthread_key_t key);void pthread_cleanup_pop (int execute);void pthread_cleanup_push (void (*routine)(void*),void *arg);void pthread_exit (void *value_ptr);void pthread_testcancel (void);pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_once_t once_control = PTHREAD_ONCE_INIT;
``
pthread 编程相关推荐
- 并行算法第五讲:Pthread编程
文章目录 第五讲:Pthread编程 Pthread相关函数 共享内存--矩阵向量乘法应用 临界区 生产者-消费者模型 路障和条件变量 并行算法设计与分析课程总结 第五讲:Pthread编程 Pthr ...
- SSL 多线程通信 linux openSSL C API编程
一.环境 需要提前准备好服务端和客户端的证书和私钥,以及CA的证书. OpenSSL 1.1.1f 31 Mar 2020 built on: Wed Nov 24 13:20:48 2021 UT ...
- 并行程序设计——OMP编程
并行程序设计--OMP编程 实验一 实验内容 分别实现课件中的梯形积分法的Pthread.OpenMP版本,熟悉并掌握OpenMP编程方法,探讨两种编程方式的异同. 实验代码 OpenMP编程 #in ...
- linux线程有什么用,在linux下查看一个进程它有多少个线程是用什么命令?
ps -ef f 用树形显示进程和线程,比如说我想找到proftp现在有多少个进程/线程,可以用 $ ps -ef f | grep proftpd nobody 23117 1 0 Dec23 ? ...
- Linux查看进程线程个数
1.根据进程号进行查询: # pstree -p 进程号 # top -Hp 进程号 2.根据进程名字进行查询: # pstree -p `ps -e | grep server | awk '{pr ...
- Linux下查看进程和线程
在linux中查看线程数的三种方法 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行显示一个进程. 2.ps xH 手册 ...
- linux进程和线程教程,Linux下查看进程和线程
在Linux中查看线程数的三种方法 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行显示一个进程. 2.ps xH 手册 ...
- linux下查看进程的线程数,linux查看进程的线程数
top -H -p $PID #查看对应进程的那个线程占用CPU过高 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行 ...
- Graphite Simulator模拟器详解
Graphite模拟器 Graphite Simulator是由MIT的Carbon研究组开发的一款并行分布式全系统模拟器.设计目标是针对与未来的多核甚至千核,提供高性能的设计和软件开发平台.使用了直 ...
- linux查看进程线程的方法
在Linux中查看线程数的三种方法 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行显示一个进程. 2.ps xH 手册 ...
最新文章
- python多进程队列性能测试
- struct2 开发环境搭建 问题
- Java线上应用故障排查之一:高CPU占用
- php mysql 预编译语句_php mysql 预编译
- 正在启动oracle universal,oracle的常见问题与解决
- P2911 [USACO08OCT]Bovine Bones G (python3实现)
- 两分钟搞定阿里SQL面试题:亿级表合并
- logic:equal,logic:present用法
- SqlSession接口和Executor
- python海龟交易策略_【手把手教你】用Python量化海龟交易法则
- 如果你想成为一名黑客
- 计算机常规教学ppt,计算机基本PPT教学.ppt
- D-Link 智能家居新品将登陆苹果中国官网
- node状态管理cookie,session,token的各自特点和使用方法还有hash算法加密
- OpenGL 亮度调节
- 『迷你教程』识别人类活动的一维卷积神经网络模型,附完整代码
- 【ZZULIOJ】1053: 正弦函数
- 两个月,看完这套资料他终于如愿拿到阿里 Offer 了!
- JDK环境配置与含义
- 为MCU在Qt上运行Doom
热门文章
- 游学只缘图利国 求知理应做腾骧
- html广告代码自适应,很实用的对联广告代码(自适应高度)
- html文件中flash视频格式(flv、swf)文件的嵌入方法
- 如何下载电驴网站Verycd上的资源
- Windows桌面软件美化界面:分享著名的VC++ DirectUI/duilib/SOUI/REDM,IMGUI和C#开源界面库
- Gstreamer uridecodebin 插件手动选择解码器
- 编辑邮件时去掉回车光标跟随
- 软考高级系统架构设计师总结
- 基于springboot的医院管理系统
- 面向自动驾驶的高精度地图框架解析和实战