公司项目比较大,目前对项目的理解在于其一个项目分为了很多进程,这些进程,每个进程代表着一个大的独立模块,每个进程又包含很多个线程,每个线程启动着一些小模块,有关联的小模块构成一个独立的大模块,几个不关联的大模块构成整个项目
线程的创建和使用
1.相关函数:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
[1]返回值为0代表线程创建成功
[2]第一个参数是线程的ID,不必赋值,线程启动会自动赋值
[3]第二个参数用于设定线程的配置,一般设置NULL
[4]第三个参数用于指定创建线程后要被调用的函数这个函数有特定格式要求:void* 函数名(void* arg)
[5]第四个参数用于输入上述被调用函数的参数值
int pthread_join(pthread_t thread, void **retval);
[1]反回值为0即成功,否者出错,这个函数为阻塞等待
[2]第一个参数用于指定要等待结束的线程的id
[3]第二个参数用于接收被等待线程的返还值(如果有返还值)
2.事例:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#define ZKW_INIT_TRUE 1
#define ZKW_INIT_FLASE 0
int g_zkw_init_flag = 0; // zkw状态:0 - 关闭 1 - 打开
pthread_t zkw_init_thread;
pthread_t zkw_other_thread;
/*
zkw初始化函数
*/
void* zkw_init(void* arg){
for(int i = 0; i < 5; i ++){
printf("zkw正在初始化...\n");
sleep(2);
}
}
/*
zkw同步其他工具
*/
void* zkw_other(void* arg){
for(int i = 0; i < 5; i ++){
printf("正在同步项目需求的其他工具...\n");
sleep(1);
}
}
int main() {
/*创建线程初始化zkw*/
if(pthread_create(&zkw_init_thread, NULL, zkw_init, NULL) != 0){
printf("zkw初始化失败\n");
return -1;
}
/*创建线程退出zkw*/
if(pthread_create(&zkw_other_thread, NULL, zkw_other, NULL) != 0){
printf("zkw其他工具同步失败\n");
return -1;
}
/*阻塞等待线程完成*/
pthread_join(zkw_init_thread, NULL);
pthread_join(zkw_other_thread, NULL);
printf("\n");
printf("zkw启动完成\n");
}
在进程中创建了两个独立运行的线程,主进程等待线程结束再结束
3.竞争态的处理:
如果两个线程同时修改同一个全局变量的时候就会造成竞争态,这里可用互斥锁处理
pthread_mutex_t lock; // 定义互斥锁
pthread_mutex_init(&lock, NULL); // 初始化互斥锁
/*锁定和解锁*/
pthread_mutex_lock(&lock);
// 修改全局变量的代码
pthread_mutex_unlock(&lock);
pthread_mutex_lock(&lock)
与pthread_mutex_unlock(&lock)
之间调用的全局变量就会被锁定