企业的网站维护,互联网平台建设方案,中国建设网官方,h5素材做多的网站一、线程同步概念#xff1a;
线程同步是指在多线程编程中#xff0c;为了保证多个线程之间的数据访问和操作的有序性以及正确性#xff0c;需要采取一些机制来协调它们的执行。在多线程环境下#xff0c;由于线程之间是并发执行的#xff0c;可能会出现竞争条件#xf…一、线程同步概念
线程同步是指在多线程编程中为了保证多个线程之间的数据访问和操作的有序性以及正确性需要采取一些机制来协调它们的执行。在多线程环境下由于线程之间是并发执行的可能会出现竞争条件Race Condition等问题从而导致程序的不稳定性和错误。
案例与猜想
示例1
#include iostream
#include windows.hint g;DWORD WINAPI MyThreadProc (LPVOID lp){for(int i 0; i 100000000; i){g;}return 0;
}int main(){HANDLE h CreateThread(NULL, 0, MyThreadProc, NULL, 0, 0);for(int i 0; i 100000000; i){g;}std::cout g std::endl;CloseHandle(h);return 0;
}
结果 这里测试了两个次当多个线程同时对公共资源进行操作时会发生错误该示例结果始终处在 100000000~200000000之间
猜测一主线程可能先走完然后输出g并退出。
示例2
因此在这里继续添加一个等待线程函数WaitForSingleObject等待线程结束试试 发现依旧无法达到预期。 猜测二线程与线程之间存在同步使得g在某一个或某一些值时g在主线程与线程中只增加一次。
二、解决方法
常见的线程同步机制包括 1. 互斥锁Mutex互斥锁是一种保护共享资源的机制它确保在任意时刻只有一个线程能够访问被保护的资源。当一个线程获得了互斥锁其他线程就需要等待锁的释放才能访问资源。 2. 信号量Semaphore信号量是一种用于控制同时访问某一资源的线程数目的方法。它可以允许多个线程同时访问资源但是可以通过信号量的计数来控制同时访问的线程数量。 3. 条件变量Condition Variable条件变量用于在某些特定条件下使线程等待或唤醒。它通常与互斥锁一起使用以实现在满足特定条件时线程的阻塞和唤醒。 4. 读写锁Read-Write Lock读写锁允许多个线程同时读取共享资源但是在写操作时需要互斥锁来保护资源以避免多个线程同时写入导致数据不一致性。 5. 原子操作Atomic Operations原子操作是一种不可分割的操作能够保证在多线程环境下的执行不会被中断从而避免竞争条件。
线程同步的目的是确保线程之间的协调和有序执行以避免数据竞争和其他并发问题。选择合适的线程同步机制取决于具体的应用场景和需求。
1.互斥锁Mutex
PS临界区同样存在计数机制进入几次临界区就要退出几次临界区
示例
#include iostream
#include windows.hint g;CRITICAL_SECTION g_cs;//创建互斥锁DWORD WINAPI MyThreadProc (LPVOID lp){for(int i 0; i 100000000; i){EnterCriticalSection(g_cs); //进入临界区g;LeaveCriticalSection(g_cs); //离开临界区}return 0;
}int main(){InitializeCriticalSection(g_cs);//初始化互斥锁HANDLE h CreateThread(NULL, 0, MyThreadProc, NULL, 0, 0);for(int i 0; i 100000000; i){EnterCriticalSection(g_cs); //进入临界区g;LeaveCriticalSection(g_cs); //进入临界区}WaitForSingleObject(h, INFINITE);std::cout g std::endl;CloseHandle(h);DeleteCriticalSection(g_cs);return 0;
}
结果 需要注意的是过多地使用互斥锁可能会导致性能问题因为只有一个线程能够执行临界区代码其他线程需要等待 未完待续……