文章目录

  • 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 编程相关推荐

  1. 并行算法第五讲:Pthread编程

    文章目录 第五讲:Pthread编程 Pthread相关函数 共享内存--矩阵向量乘法应用 临界区 生产者-消费者模型 路障和条件变量 并行算法设计与分析课程总结 第五讲:Pthread编程 Pthr ...

  2. SSL 多线程通信 linux openSSL C API编程

    一.环境 需要提前准备好服务端和客户端的证书和私钥,以及CA的证书. OpenSSL 1.1.1f  31 Mar 2020 built on: Wed Nov 24 13:20:48 2021 UT ...

  3. 并行程序设计——OMP编程

    并行程序设计--OMP编程 实验一 实验内容 分别实现课件中的梯形积分法的Pthread.OpenMP版本,熟悉并掌握OpenMP编程方法,探讨两种编程方式的异同. 实验代码 OpenMP编程 #in ...

  4. linux线程有什么用,在linux下查看一个进程它有多少个线程是用什么命令?

    ps -ef f 用树形显示进程和线程,比如说我想找到proftp现在有多少个进程/线程,可以用 $ ps -ef f | grep proftpd nobody 23117 1 0 Dec23 ? ...

  5. Linux查看进程线程个数

    1.根据进程号进行查询: # pstree -p 进程号 # top -Hp 进程号 2.根据进程名字进行查询: # pstree -p `ps -e | grep server | awk '{pr ...

  6. Linux下查看进程和线程

    在linux中查看线程数的三种方法 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行显示一个进程. 2.ps xH 手册 ...

  7. linux进程和线程教程,Linux下查看进程和线程

    在Linux中查看线程数的三种方法 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行显示一个进程. 2.ps xH 手册 ...

  8. linux下查看进程的线程数,linux查看进程的线程数

    top -H -p $PID  #查看对应进程的那个线程占用CPU过高 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行 ...

  9. Graphite Simulator模拟器详解

    Graphite模拟器 Graphite Simulator是由MIT的Carbon研究组开发的一款并行分布式全系统模拟器.设计目标是针对与未来的多核甚至千核,提供高性能的设计和软件开发平台.使用了直 ...

  10. linux查看进程线程的方法

    在Linux中查看线程数的三种方法 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行显示一个进程. 2.ps xH 手册 ...

最新文章

  1. python多进程队列性能测试
  2. struct2 开发环境搭建 问题
  3. Java线上应用故障排查之一:高CPU占用
  4. php mysql 预编译语句_php mysql 预编译
  5. 正在启动oracle universal,oracle的常见问题与解决
  6. P2911 [USACO08OCT]Bovine Bones G (python3实现)
  7. 两分钟搞定阿里SQL面试题:亿级表合并
  8. logic:equal,logic:present用法
  9. SqlSession接口和Executor
  10. python海龟交易策略_【手把手教你】用Python量化海龟交易法则
  11. 如果你想成为一名黑客
  12. 计算机常规教学ppt,计算机基本PPT教学.ppt
  13. D-Link 智能家居新品将登陆苹果中国官网
  14. node状态管理cookie,session,token的各自特点和使用方法还有hash算法加密
  15. OpenGL 亮度调节
  16. 『迷你教程』识别人类活动的一维卷积神经网络模型,附完整代码
  17. 【ZZULIOJ】1053: 正弦函数
  18. 两个月,看完这套资料他终于如愿拿到阿里 Offer 了!
  19. JDK环境配置与含义
  20. 为MCU在Qt上运行Doom

热门文章

  1. 游学只缘图利国 求知理应做腾骧
  2. html广告代码自适应,很实用的对联广告代码(自适应高度)
  3. html文件中flash视频格式(flv、swf)文件的嵌入方法
  4. 如何下载电驴网站Verycd上的资源
  5. Windows桌面软件美化界面:分享著名的VC++ DirectUI/duilib/SOUI/REDM,IMGUI和C#开源界面库
  6. Gstreamer uridecodebin 插件手动选择解码器
  7. 编辑邮件时去掉回车光标跟随
  8. 软考高级系统架构设计师总结
  9. 基于springboot的医院管理系统
  10. 面向自动驾驶的高精度地图框架解析和实战