在哪里能建免费的网站宠物网站页面设计简笔
2025/12/31 7:55:54 网站建设 项目流程
在哪里能建免费的网站,宠物网站页面设计简笔,郑州最好的装修设计公司,东营百姓网线程控制 - 互斥与同步一、 互斥#xff08;Mutex#xff09;1.概念在多线程中对临界资源的排他性访问。临界资源#xff1a;在多线程中会被多个线程进行读写操作的资源#xff08;全局变量、文件、设备等#xff09;排他访问#xff1a;同一时刻只能有一个线程进行读写操…线程控制 - 互斥与同步一、 互斥Mutex1.概念在多线程中对临界资源的排他性访问。临界资源在多线程中会被多个线程进行读写操作的资源全局变量、文件、设备等排他访问同一时刻只能有一个线程进行读写操作2.用途在多线程中一个资源同一时刻只能有一个线程访问。示例问题int A 0; // 临界资源 // 线程1 void* th1(void* arg) { A; // 这不是原子操作 } // 线程2 void* th2(void* arg) { A; }A在汇编中至少需要3步读取A到寄存器寄存器值加1将结果写回A如果th1执行了1、2步后切换到th2就会发生数据一致性问题。解决方案使用互斥锁使用步骤定义互斥锁初始化锁加锁解锁销毁相关函数1. 定义互斥锁pthread_mutex_t mutex;2. 初始化锁int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);功能初始化互斥锁参数mutex要初始化的互斥锁attr初始化属性一般为NULL默认锁返回值成功返回0失败返回非03. 加锁int pthread_mutex_lock(pthread_mutex_t *mutex);功能给代码加锁特点加锁到解锁之间的代码属于原子操作在加锁期间其他线程不能执行该部分代码如果锁已被占用线程会阻塞等待返回值成功返回0失败返回非04. 解锁int pthread_mutex_unlock(pthread_mutex_t *mutex);功能解锁互斥锁注意加锁和解锁一般成对出现返回值成功返回0失败返回非05. 销毁int pthread_mutex_destroy(pthread_mutex_t *mutex);功能销毁互斥锁返回值成功返回0失败返回非0示例代码#include stdio.h #include stdlib.h #include string.h #include unistd.h #include pthread.h int A 0 ; pthread_mutex_t mutex; void* th(void* arg) { // pthread_mutex_lock(mutex); int i 5000; while(i--) { pthread_mutex_lock(mutex); int tmp A; printf(A is %d\n,tmp1); A tmp1; pthread_mutex_unlock(mutex); } //pthread_mutex_unlock(mutex); return NULL; } int main(int argc, char **argv) { pthread_t tid1,tid2; pthread_mutex_init(mutex,NULL); pthread_create(tid1,NULL,th,NULL); pthread_create(tid2,NULL,th,NULL); pthread_join(tid1,NULL); pthread_join(tid2,NULL); pthread_mutex_destroy(mutex); return 0; }2. 同步Synchronization概念按照一定先后顺序对资源的排他性访问。与互斥的关系互斥包含同步同步是互斥的一个特例互斥只关心资源是否被占用同步不仅关心资源还关心访问顺序3. 信号量Semaphore与互斥锁的区别加锁/解锁主体互斥锁加锁和解锁必须是同一个线程信号量可以由不同线程交叉释放th1释放th2th2释放th1使用场景互斥锁临界区代码要短小精悍不要有休眠或耗时操作信号量可以有适当的休眠和小耗时操作计数信号量信号量初值可以大于1用于多个资源的情况。使用步骤定义信号量初始化信号量PV操作销毁信号量相关函数1. 定义信号量sem_t sem;2. 初始化信号量int sem_init(sem_t *sem, int pshared, unsigned int value);功能初始化信号量参数sem要初始化的信号量pshared0线程间使用非0进程间使用value信号量初始值二值信号量0或10红灯线程阻塞1绿灯线程可通过返回值成功返回0失败返回-13. PV操作P操作申请资源 →sem_wait()V操作释放资源 →sem_post()sem_wait()int sem_wait(sem_t *sem);功能申请信号量资源行为如果有资源0申请资源继续执行如果没资源0线程阻塞等待注意自动执行sem sem - 1返回值成功返回0失败返回-1sem_post()int sem_post(sem_t *sem);功能释放信号量资源注意自动执行sem sem 1返回值成功返回0失败返回-14. 销毁信号量int sem_destroy(sem_t *sem);示例代码#include pthread.h #include stdio.h #include stdlib.h #include string.h #include time.h #include unistd.h #include semaphore.h sem_t sem_H,sem_W; void* th1(void* arg) { int i 10; while(i--) { sem_wait(sem_H);// sem_H -1 printf(hello ); fflush(stdout); sem_post(sem_W);// sem_W 1 } return NULL; } void* th2(void* arg) { int i 10; while(i--) { sem_wait(sem_W); printf(world\n); sleep(1); sem_post(sem_H); } return NULL; } int main(int argc, char **argv) { pthread_t tid1,tid2; sem_init(sem_H,0,1); sem_init(sem_W,0,0); pthread_create(tid1, NULL, th1,NULL); pthread_create(tid2, NULL, th2,NULL); pthread_join(tid1,NULL); pthread_join(tid2,NULL); sem_destroy(sem_H); sem_destroy(sem_W); return 0; }4. 死锁Deadlock概念由于锁资源安排不合理导致进程/线程无法继续执行的现象。产生死锁的四个必要条件互斥条件一个资源每次只能被一个进程使用请求与保持条件一个进程因请求资源而阻塞时对已获得的资源保持不放不剥夺条件进程已获得的资源在未使用完之前不能强行剥夺循环等待条件若干进程之间形成一种头尾相接的循环等待资源关系死锁示例pthread_mutex_t mutexA PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t mutexB PTHREAD_MUTEX_INITIALIZER; // 线程1 void* thread1(void* arg) { pthread_mutex_lock(mutexA); // 获取锁A sleep(1); pthread_mutex_lock(mutexB); // 尝试获取锁B → 死锁 // ... pthread_mutex_unlock(mutexB); pthread_mutex_unlock(mutexA); return NULL; } // 线程2 void* thread2(void* arg) { pthread_mutex_lock(mutexB); // 获取锁B sleep(1); pthread_mutex_lock(mutexA); // 尝试获取锁A → 死锁 // ... pthread_mutex_unlock(mutexA); pthread_mutex_unlock(mutexB); return NULL; }5. 总结对比特性互斥锁Mutex信号量Semaphore用途保护临界区确保互斥访问控制资源访问数量资源数通常保护单个资源可以保护多个相同资源加锁/解锁必须由同一线程完成可由不同线程完成阻塞锁被占用时线程阻塞资源数为0时线程阻塞计数无计数功能有计数功能性能轻量级适用于短临界区稍重适用于较复杂同步使用原则能用互斥锁就用互斥锁因为它更简单高效临界区要短小不要包含耗时操作避免死锁按固定顺序申请锁或使用超时机制锁的粒度要合适不要过大影响并发或过小增加开销

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

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

立即咨询