Linux【8】-----Linux系统编程(并发编程原理与应用)
1 线程
1.1 线程创建
可以使用
#include <pthread.h>int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
- thread 是指向线程标识符的指针,线程创建成功,用来返回线程ID
- attr 指定线程属性
- start_routine 函数指针,就是线程创建后要调用的函数
- arg 传递给线程函数的参数
线程使用的是进程的资源,进程结束后其他线程也会一起退出
1.2 线程退出
使用
pthread_exit()
该接口可以实现线程终止
或线程执行的函数内部执行return
主线程调用
pthread_exit()
不会导致子线程结束
但是如果调用exit()或return,就会导致所以线程结束
1.3 线程接合
pthread_join 用来释放僵尸线程资源,
退出状态会被保存到retval中
#include <pthread.h>int pthread_join(pthread_t thread, void **retval);
1.4 线程属性
线程的属性是在线程创建过程中进行设置的
#include <pthread.h>int pthread_attr_init(pthread_attr_t *attr);int pthread_attr_destroy(pthread_attr_t *attr);
让线程分离,在线程终止后,就会自动释放资源
练习:设计一个程序,要求在程序中创建两条子线程,主线程创建一个线程的属性对象,并对线程的属性对象进行初始化之后,要求创建的子线程的属性设置为分离属性,子线程A输出”hello”,子线程B输出”world”,主线程创建子线程之后就终止。
void *task_1(void *arg){printf("Hello ");
}void *task_2(void *arg){printf("world ");
}int main(){pthread_attr_t thread_attr;pthread_attr_init(&thread_attr);pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE);pthread_t thread_1;pthread_create(&thread_1, &thread_attr, task_1, NULL);pthread_t thread_2;pthread_create(&thread_2, &thread_attr, task_2, NULL);sleep(1);return 0;
}
如果在创建线程之初不设置属性,可以使用pthread_detach()
函数来强制设置自身属性为分离属性。
2 多线程的同步与互斥
2.1 互斥锁
- 互斥锁需要经过初始化:
#incldue <pthread.h>
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
互斥量本质上就是一个变量,类型为pthread_mutex_t
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
- 上锁解锁操作
pthread_mutex_lock(pthread_mutex_t* mutex);
pthread_mutex_trylock(pthread_mutex_t* mutex);
pthread_mutex_unlock(pthread_mutex_t* mutex);
练习:创建一个进程,在主线程中创建一个子线程,主线程和子线程都会使用相同的临界资源(全局变量),要求线程之前使用互斥锁实现资源的互斥访问。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int data;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *task_1(void *arg){for(int i = 0; i < 20000; i++){//pthread_mutex_lock(&mutex);data = data+1;//pthread_mutex_unlock(&mutex);}
}void *task_2(void *arg){for(int i = 0; i < 20000; i++){pthread_mutex_lock(&mutex);data = data+1;pthread_mutex_unlock(&mutex);}
}int main(){pthread_mutex_init(&mutex, NULL);pthread_t thread_1;pthread_create(&thread_1, NULL, task_1, NULL);pthread_t thread_2;pthread_create(&thread_2, NULL, task_1, NULL);pthread_join(thread_1, NULL);pthread_join(thread_2, NULL);printf("data = %d\n", data);return 0;
}