微信网站的链接标志图片如何做怎样制作网站二维码
2026/1/24 7:38:37 网站建设 项目流程
微信网站的链接标志图片如何做,怎样制作网站二维码,做商城外贸网站,佛山设计公司排名文章目录全局变量同步问题互斥量互斥量初始化方式静态初始化#xff08;编译时#xff09;动态初始化#xff08;运行时#xff09;互斥量操作函数临界区#xff08;Critical Section#xff09;互斥量解决同步问题注意问题多线程共享全局变量 → 数据竞争问题↓ 需要同步…文章目录全局变量同步问题互斥量互斥量初始化方式静态初始化编译时动态初始化运行时互斥量操作函数临界区Critical Section互斥量解决同步问题注意问题多线程共享全局变量 → 数据竞争问题 ↓ 需要同步机制 → 互斥量(Mutex)解决方案 ↓ 互斥量使用模式 → 初始化、加锁、解锁、销毁全局变量同步问题在多线程程序中如果多个线程同时对共享的全局变量进行读写操作可能会出现数据竞争Race Condition问题导致最终结果与预期不一致/* 为突出问题 代码省略了错误处理*/#includepthread.h#includestdio.h#includestdlib.hstaticintglob;// 全局变量被所有线程共享// 线程函数void*ThreadFunc(void*arg){intloops*((int*)arg);// 从参数中获取循环次数intloc,j;for(j0;jloops;j){locglob;// 读取全局变量loc;// 局部变量自增globloc;// 将局部变量的值赋给全局变量}pthread_exit(NULL);// 线程退出}intmain(intargc,constchar*argv[]){pthread_ttid1,tid2;// 定义两个线程 IDintloops;// 检查命令行参数if(argc!2){fprintf(stderr,%s [loops]\n,argv[0]);exit(EXIT_FAILURE);}// 从命令行参数中读取循环次数if(sscanf(argv[1],%d,loops)!1){fprintf(stderr,Invalid loops\n);exit(EXIT_FAILURE);}// 创建两个线程都执行 ThreadFunc 函数pthread_create(tid1,NULL,ThreadFunc,loops);pthread_create(tid2,NULL,ThreadFunc,loops);// 等待两个线程结束pthread_join(tid1,NULL);pthread_join(tid2,NULL);// 打印最终的全局变量值printf(glob %d\n,glob);return0;}理论上如果loops为 n最终glob的值应该是 2n但结果似乎并不总是这样两个线程同时执行上述操作时可能会出现以下情况线程A读取glob值例如100线程B也读取glob仍为100两个线程都执行loc最终glob可能只增加一次而非两次被称为非原子操作导致的同步问题互斥量互斥量Mutex是一种锁机制用于保护共享资源确保同一时间只有一个线程能访问该资源属于pthread_mutex_t类型需在使用前初始化合理使用互斥量可保证线程安全提升程序稳定性互斥量初始化方式静态初始化编译时对于静态分配的互斥量而言将PTHREAD_MUTEX_INITIALIZER赋给互斥量适用于全局变量或静态变量系统会自动初始化为解锁状态#includepthread.hpthread_mutex_tmutexPTHREAD_MUTEX_INITIALIZER;静态初始化的方式等效于通过调用pthread_mutex_init()进行动态初始化并将参数attr指定为NULL但不会执行错误检查动态初始化运行时适用于动态分配于堆或栈上的互斥量动态创建针对某一结构的链表表中每个结构都包含一个pthread_mutex_t类型的字段来存放互斥量借以保护对该结构的访问需要自定义属性#includepthread.hintpthread_mutex_init(pthread_mutex_t*restrict mutex,constpthread_mutexattr_t*restrict attr);mutex指定函数执行初始化操作的目标互斥量attr是指向pthread_mutexattr_t类型对象的指针该对象在函数调用之前已经过了初始化处理用于定义互斥量的属性。若将attr参数置为NULL则该互斥量的各种属性会取默认值互斥量操作函数函数说明pthread_mutex_lock(mutex)加锁若已被锁则阻塞pthread_mutex_unlock(mutex)解锁pthread_mutex_trylock(mutex)尝试加锁失败立即返回pthread_mutex_destroy(mutex)销毁互斥量临界区Critical Sectionpthread_mutex_lock(mutex);// 临界区访问共享资源的代码glob;pthread_mutex_unlock(mutex);互斥量解决同步问题静态初始化#includepthread.h#includestdio.h#includestdlib.h#includestring.hstaticintglob;//临界资源pthread_mutex_tmutexPTHREAD_MUTEX_INITIALIZER;// 静态初始化互斥量void*ThreadFunc(void*arg){intloops*((int*)arg);intloc,j;for(j0;jloops;j){pthread_mutex_lock(mutex);//加锁与解锁的代码区域被称为 临界区locglob;loc;globloc;pthread_mutex_unlock(mutex);}pthread_exit(NULL);}intmain(intargc,constchar*argv[]){pthread_ttid1,tid2;intloops;if(argc!2){fprintf(stderr,%s [loops]\n,argv[0]);exit(EXIT_FAILURE);}if(sscanf(argv[1],%d,loops)!1){fprintf(stderr,Invalid loops\n);exit(EXIT_FAILURE);}intretpthread_create(tid1,NULL,ThreadFunc,loops);if(ret!0){fprintf(stderr,pthread_create:%s\n,strerror(ret));exit(EXIT_FAILURE);}retpthread_create(tid2,NULL,ThreadFunc,loops);if(ret!0){fprintf(stderr,pthread_create:%s\n,strerror(ret));exit(EXIT_FAILURE);}retpthread_join(tid1,NULL);if(ret!0){fprintf(stderr,pthread_join tid1:%s\n,strerror(ret));exit(EXIT_FAILURE);}retpthread_join(tid2,NULL);if(ret!0){fprintf(stderr,pthread_join tid2:%s\n,strerror(ret));exit(EXIT_FAILURE);}printf(glob %d\n,glob);return0;}动态初始化/* 省略了错误处理*/#includepthread.h#includestdio.h#includestdlib.hstaticintglob;structthread{intloops;pthread_mutex_tmutex;};// 线程函数void*ThreadFunc(void*arg){structthread*data(structthread*)arg;// 从参数中获取循环次数intloc,j;for(j0;jdata-loops;j){pthread_mutex_lock(data-mutex);glob;pthread_mutex_unlock(data-mutex);}pthread_exit(NULL);// 线程退出}intmain(intargc,constchar*argv[]){pthread_ttid1,tid2;// 定义两个线程 IDstructthreaddata;pthread_mutex_init(data.mutex,NULL);// 检查命令行参数if(argc!2){fprintf(stderr,%s [loops]\n,argv[0]);exit(EXIT_FAILURE);}// 从命令行参数中读取循环次数if(sscanf(argv[1],%d,data.loops)!1){fprintf(stderr,Invalid loops\n);exit(EXIT_FAILURE);}// 创建两个线程都执行 ThreadFunc 函数pthread_create(tid1,NULL,ThreadFunc,data);pthread_create(tid2,NULL,ThreadFunc,data);// 等待两个线程结束pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_mutex_destroy(data.mutex);// 打印最终的全局变量值printf(glob %d\n,glob);return0;}注意问题静态初始化用于全局/静态变量动态初始化用于局部/动态变量不要重复初始化已初始化的互斥量不要在锁定的状态下销毁互斥量确保所有线程解锁后再销毁互斥量加锁与解锁必须成对出现避免死锁临界区应尽量简短避免长时间占用锁**互斥锁无论读写都只能被一个线程持有。****读写锁的核心特点是读锁共享多个线程可同时持有读锁、写锁独占仅一个线程可持有写锁。**两者都需要初始化性能取决于场景读多写少场景读写锁更优

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询