赞
踩
线程(LWP(Light Weight process))
线程是轻量级的进程,(是比进程粒度更小的执行单元)进程是分配资源的最小单位(0-3G)(PS:一辆马车8匹马 进程 其中的一个马是线程),线程是调度(PS:或执行)的最小单位。线程本身不占用资源它是共享进程的资源(PS:一个进程中的许多线程 共享一个进程的0-3G空间)。线程没有进程安全,(PS:考虑安全 选择多进程,考虑并发性 选多线程)因为如果一个线程导致进程结束,其他所有的线程都不能执行。多线程的并发性比多进程的高,因为线程间切换比进程间切换时间短。线程间资源共享(PS:一个进程的全局变量 其中的线程能全部共享),所以线程间通信要比进程间通信更为容易。
- ps -ajx ==>看进程附加态(状态带(小L)l,代表多线程)
- ps -eLf ==>多线程
- htop ==>多线程
多线程创建的接口是第三方库提供的libpthread.so,在编译的时候就必须链接这个库gcc xxx.c -lpthread,man手册需要使用apt-get来安装(sudo apt-get install manpages-*)。
- #include <pthread.h>
-
- int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
- void *(*start_routine) (void *), void *arg);
- 功能:创建一个线程
- 参数:
- @thread:线程号
- @attr:线程属性,使用默认值NULL (PS线程属性:https://docs.oracle.com/cd/E19253-01/819-7051/6n919hpaa/index.html)
- @start_routine:线程处理函数(线程体)
- @arg:给线程处理函数传参(PS:多参数 可用结构体传参)
- 返回值:成功返回0,失败返回错误码
- Compile and link with -lpthread.
- (PS:编译的时候 要链接这个库,gcc xxx.c -lpthread)
01thread.c
- #include <head.h>
- void * thread(void *arg){
- printf("子线程...\n");
- }
- int main(int argc,const char * argv[])
- {
- pthread_t tid;
- if((errno=(pthread_create(&tid,NULL,thread,NULL))!=0)){
- perror("pthread_create error");
- exit(-1); //pthread_create函数成功返回0
- }
- printf("主线程...\n");
- sleep(1);//不能让进程退出 线程退出了 线程就没有执行的内存了
- return 0;
- }
02thread.c
- #include <head.h>
- void *thread(void *arg)
- {
- int a = *(int *)arg;
- printf("a = %d\n", a);
- printf("子线程...\n");
- }
- int main(int argc, const char *argv[])
- {
- pthread_t tid;
- int num = 100;
- if ((errno = (pthread_create(&tid, NULL, thread, (void *)&num)) != 0))
- {
- perror("pthread_create error");
- exit(-1); // pthread_create函数成功返回0
- }
-
- printf("主线程...\n");
- sleep(1); // 不能让进程退出 线程退出了 线程就没有执行的内存了
- return 0;
- }
多线程执行没有先后顺序、时间片轮询,上下文切换
多线程可以共享全局变量,每个线程都可以对此全局变量进行读写操作(全局变量可以被多线程贡共享)
- #include <head.h>
- int B = 10;
- void *thread1(void *arg)
- {
- printf("子线程1...\n");
- while (1)
- {
- B++;
- sleep(1);
- }
- }
- void *thread2(void *arg)
- {
- printf("子线程2...\n");
- while (1)
- {
- printf("B= %d\n", B);
- sleep(1);
- }
- }
- int main(int argc, const char *argv[])
- {
- pthread_t tid1, tid2;
-
- if ((errno = (pthread_create(&tid1, NULL, thread1, NULL)) != 0))
- {
- perror("pthread_create error");
- exit(-1); // pthread_create函数成功返回0
- }
- if ((errno = (pthread_create(&tid2, NULL, thread2, NULL)) != 0))
- {
- perror("pthread_create error");
- exit(-1); // pthread_create函数成功返回0
- }
-
- printf("主线程...\n");
- while (1)
- {
- }
- // 不能让进程退出 线程退出了 线程就没有执行的内存了
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。