当前位置: 首页 > news >正文

微信生活门户网站源码alexa排名是什么意思

微信生活门户网站源码,alexa排名是什么意思,苏州写信小程序开发公司,浙江企业黄页大全文章目录 前言1、ResetEvent2、SetEvent3、WaitForSingleObject4、WaitForMultipleObjects 前言 SetEvent 和 ResetEvent 是 Windows 操作系统提供的函数#xff0c;用于操作事件对象。它们属于同步原语函数#xff0c;用于实现线程同步和互斥。这些函数的类型如下#xff1… 文章目录 前言1、ResetEvent2、SetEvent3、WaitForSingleObject4、WaitForMultipleObjects 前言 SetEvent 和 ResetEvent 是 Windows 操作系统提供的函数用于操作事件对象。它们属于同步原语函数用于实现线程同步和互斥。这些函数的类型如下 SetEvent: 声明BOOL WINAPI SetEvent(HANDLE hEvent);功能将指定的事件对象的状态设置为有信号状态唤醒正在等待该事件的线程使其可以继续执行。用途通常用于通知等待事件的线程可以继续执行例如在异步操作完成时通知等待线程。 ResetEvent: 声明BOOL WINAPI ResetEvent(HANDLE hEvent);功能将指定的事件对象的状态设置为无信号状态使它不能唤醒等待事件的线程等待线程将被阻塞。用途通常用于重置事件的状态以便稍后可以通过 SetEvent 再次将其设置为有信号状态。 这些函数通常用于多线程编程用于协调和同步线程的操作。SetEvent 用于通知线程可以执行而 ResetEvent 用于阻止线程执行直到事件被设置为有信号状态。这种机制可以用于实现线程之间的通信和同步以确保线程按照所需的顺序执行。 1、ResetEvent 代码定义: WINBASEAPI BOOL WINAPI ResetEvent(__in HANDLE hEvent);代码解释: ResetEvent 是Windows API中的一个函数用于将事件对象Event的状态重置为非触发状态。事件是一种用于线程同步的内核对象它可以处于有信号signaled或无信号nonsignaled状态。通常事件对象被用于线程之间的通信和同步。 函数原型如下 BOOL WINAPI ResetEvent(__in HANDLE hEvent ); 参数解释 hEvent 要重置的事件对象的句柄。 ResetEvent 函数的作用是将指定事件对象的状态从有信号重置为无信号这意味着线程等待该事件的状态将变为未满足因此如果有线程在等待该事件则它们将继续等待直到该事件再次被触发。 通常情况下ResetEvent 用于重用事件对象例如多个线程等待某个事件的触发一旦事件被触发它将执行相关操作然后通过 ResetEvent 重新将事件状态重置为无信号以便下一次等待。这有助于实现线程间的协同工作和同步。 请注意ResetEvent 函数通常与 SetEvent 函数结合使用SetEvent 用于将事件状态设置为有信号而 ResetEvent 用于将其重置为无信号。这种组合允许多个线程在事件上等待当事件被触发后一个线程执行相关操作然后通过 ResetEvent 重置事件状态以便下一个线程等待。 结合实际代码: int CAuthenManager::GetAccountState(const tstring tgt) {TRACET();if(tgt.empty()){TRACEE(tgt is empty!);return SDOL_ERRORCODE_FAILED;}TRACED(_T(tgt is [%s].), tgt.c_str());if (m_pSdoBaseHandle NULL){TRACEE(m_pSdoBaseHandle is NULL!);return SDOL_ERRORCODE_FAILED;}ResetEvent(m_hEventLs);SetTimeout(GET_TICKET_TIME_OUT, SECOND_CHECK_ACCOUNT_TIME_OUT);CTimeRecorder::GetInstance()-RecordStartTime(CallInterface_LoginBySessionIDViaSSO, ::GetTickCount());m_nLastActionId CallInterface_LoginBySessionIDViaSSO;if(0 ! SdoBase_SetSessionId(m_pSdoBaseHandle,StringHelper::UnicodeToUtf8(tgt).c_str())){TRACEW(AM -- a.ss.l set session failed.);return FALSE;}int nError 0;while (true){nError SdoBase_ExtendLoginState2(m_pSdoBaseHandle,StringHelper::UnicodeToUtf8(tgt).c_str());if (nError ERROR_PROCESSING){TRACEW(AM -- g.tkt -- Sb is busy, processing another request. Error[%d], nError);Sleep(300);continue;}break;}SetTimeout(DEFAULT_TIME_OUT, SECOND_DEFAULT_TIME_OUT);if (nError ! 0){TRACEE(AM -- g.tkt -- Calling interface failed. Error[%d], nError);return SDOL_ERRORCODE_FAILED;}if (WAIT_TIMEOUT WaitForSingleObject(m_hEventLs, GET_TICKET_TIME_OUT SECOND_GET_TICKET_TIME_OUT)){TRACEE(AM -- g.tkt -- timeout!);return SDOL_ERRORCODE_GETTICKET_TIMEOUT;}return get_account_state_error_code; }代码解释: 这段C代码是一个身份认证管理器的实现用于验证获取用户帐户的状态。以下是代码的主要步骤和逻辑 如果传入的 tgt目标参数为空会返回 SDOL_ERRORCODE_FAILED并记录错误消息。 如果 m_pSdoBaseHandle 为 NULL同样会返回 SDOL_ERRORCODE_FAILED表示未初始化句柄。 调用 ResetEvent(m_hEventLs) 来重置一个事件对象用于等待异步操作的完成。接下来设置了一个超时时间。 调用 SdoBase_SetSessionId 来设置会话 ID该函数传入了 tgt 的 UTF-8 表示。如果设置会话失败会返回 FALSE。 进入一个循环调用 SdoBase_ExtendLoginState2 来检查登录状态传入 tgt 的 UTF-8 表示。如果返回值为 ERROR_PROCESSING表示服务忙碌会等待一段时间后继续尝试直到成功为止。 设置默认超时时间然后检查上一步的返回值如果不为0表示调用接口失败返回 SDOL_ERRORCODE_FAILED。 调用 WaitForSingleObject 来等待事件 m_hEventLs 的信号等待的超时时间是 GET_TICKET_TIME_OUT SECOND_GET_TICKET_TIME_OUT 毫秒。 如果超时返回 SDOL_ERRORCODE_GETTICKET_TIMEOUT否则返回 get_account_state_error_code。 这段代码的目的似乎是执行一系列身份验证和状态检查操作可能是为了获取用户帐户的认证状态。在代码中使用了异步等待事件以及处理不同的错误和超时情况。最后的返回值可能是 get_account_state_error_code 的值但该值的定义未在提供的代码中找到。 如果没有ResetEvent(m_hEventLs) 会发生什么事情。 如果没有 ResetEvent(m_hEventLs);事件 m_hEventLs 的状态将保持为有信号状态。这意味着一旦事件被设置为有信号状态通常是通过 SetEvent 函数等待事件的线程将立即被唤醒并可以继续执行。等待事件的线程不会被阻塞即使事件一直处于有信号状态。 在上下文中ResetEvent 的目的是确保事件 m_hEventLs 的初始状态为无信号状态以便等待事件的线程在异步操作开始之前被阻塞。然后当异步操作完成时通过 SetEvent 将事件设置为有信号状态以唤醒等待事件的线程。 如果没有 ResetEvent(m_hEventLs);那么等待事件的线程可能会在异步操作开始之前被唤醒这可能导致竞争条件或不确定的行为。因此正确地初始化事件状态是确保线程同步和协作的重要部分。 竞争条件和不确定的行为可能发生在多线程环境中其中多个线程尝试访问和修改共享资源但由于执行顺序的不确定性可能导致问题。以下是一个简单的示例说明没有适当同步的情况下可能会发生竞争条件或不确定的行为 考虑一个具有两个线程的情况它们都试图访问共享变量 counter #include iostream #include threadint counter 0;void IncrementCounter() {for (int i 0; i 1000000; i) {counter; // 递增共享变量} }int main() {std::thread t1(IncrementCounter);std::thread t2(IncrementCounter);t1.join();t2.join();std::cout Final counter value: counter std::endl;return 0; } 在上述示例中两个线程并行地递增 counter 变量的值。 由于没有使用适当的同步机制例如互斥锁或信号量线程之间可能会发生竞争条件导致不确定的行为。 具体来说可能会出现以下情况 一个线程递增 counter 后另一个线程在读取 counter 之前也递增了它。这可能导致 counter 的值不正确。 由于线程之间的交错执行最终的 counter 值是不确定的每次运行的结果都可能不同。 在某些情况下可能会发生数据竞争导致程序崩溃或出现不可预测的行为。 为了避免这种情况应该使用适当的同步机制来确保多个线程之间正确地协同工作而不会导致竞争条件或不确定的行为。例如可以使用互斥锁来保护共享资源以便每次只有一个线程可以访问它从而避免竞争条件。 在上面的示例中由于没有适当的同步机制两个线程并发地递增 counter 变量可能会导致以下结果之一 counter 的最终值小于 2000000由于两个线程交错执行它们同时递增 counter但其中一个线程的递增操作可能会覆盖另一个线程的结果导致最终的计数值小于 2000000。 counter 的最终值大于 2000000同样由于竞争条件某个线程可能在另一个线程递增之前进行递增操作导致 counter 的最终值大于 2000000。 counter 的最终值等于 2000000虽然存在竞争条件但两个线程的操作之间的竞争可能会平均分配导致 counter 的最终值接近 2000000。 程序可能会崩溃由于没有适当的同步数据竞争可能导致程序崩溃或出现不可预测的行为。这种情况可能会因操作系统、编译器和硬件平台的不同而有所不同。 总之没有适当的同步机制多线程环境中的循环递增操作可能导致计数值的不确定性甚至可能引发竞争条件或导致程序的不稳定行为。要确保正确的行为必须使用适当的同步机制例如互斥锁以协调线程的访问。 2、SetEvent 代码定义: WINBASEAPI BOOL WINAPI SetEvent(__in HANDLE hEvent);代码解释: SetEvent 是Windows API中的一个函数用于将事件对象Event的状态设置为有信号状态signaled。事件是一种用于线程同步的内核对象它可以处于有信号signaled或无信号nonsignaled状态。通常事件对象被用于线程之间的通信和同步。 函数原型如下: BOOL WINAPI SetEvent(__in HANDLE hEvent ); 参数解释 hEvent 要设置为有信号状态的事件对象的句柄。 SetEvent 函数的作用是将指定事件对象的状态从无信号设置为有信号这意味着与该事件相关联的等待线程将立即被唤醒继续执行。 通常情况下SetEvent 用于通知等待线程某个事件已经发生使它们可以继续执行。例如一个线程可以使用 SetEvent 来通知其他线程某个任务已经完成。一旦事件被设置为有信号所有正在等待该事件的线程都将被唤醒然后它们可以执行相应的操作。 SetEvent 通常与 ResetEvent 函数结合使用。ResetEvent 用于将事件状态重置为无信号以便在下一个事件之前等待。这种组合允许多个线程在事件上等待当事件被触发后一个线程执行相关操作然后通过 ResetEvent 重置事件状态以便下一个线程等待。 请注意SetEvent 函数不会阻塞当前线程它只是设置事件的状态。 结合实际代码: void SDOAPI CAuthenManager::onExtendLoginStateCallback(int nResultCode, const char* szFailReason, SdoBaseHandle* handle) {TRACET();//获取检查登录态的结果sm_pAuthenManager-get_account_state_error_codenResultCode;::SetEvent(sm_pAuthenManager-m_hEventLs);if (nResultCode ! 0){if (nResultCode -10130200 nResultCode -10130100){// 来自认证组件中的错误码 [-10130200,-10130100]// 会被映射到区间 [-10524200,-10524100]nResultCode nResultCode - 394000;}if (szFailReason ! NULL){TRACEW(AM -- o.e.lscb ---%d---%s, nResultCode, szFailReason);}sm_pAuthenManager-RecordLastTimeSpanAndReport(nResultCode);return ;}sm_pAuthenManager-RecordLastTimeSpanAndReport(nResultCode);string strSessionId sm_pAuthenManager-GetCurrentSessionId();sm_pAuthenManager-SetSSOCookieData(StringHelper::ANSIToUnicode(strSessionId));}代码解释: 这段代码是 CAuthenManager 类的一个成员函数用于处理检查登录态的回调。以下是代码的主要步骤和逻辑 获取检查登录态的结果码 nResultCode这个结果码将在后续的逻辑中使用。这个结果码表示登录态检查的结果。 使用 ::SetEvent 函数设置 sm_pAuthenManager 对象的成员变量 m_hEventLs这是一个事件对象用于通知等待事件的线程。通过设置事件通知主调函数在前一个代码段中等待的线程可以继续执行。 如果 nResultCode 不等于0表示登录态检查失败进入错误处理分支。 如果 nResultCode 在某个范围内将其映射到另一个范围。这是一种错误码的映射处理。 如果 szFailReason 不为NULL记录错误消息。 调用 sm_pAuthenManager 的 RecordLastTimeSpanAndReport 函数可能用于记录和报告错误。 如果 nResultCode 等于0表示登录态检查成功进入成功处理分支。 调用 sm_pAuthenManager 的 RecordLastTimeSpanAndReport 函数可能用于记录和报告成功。 获取当前会话的会话IDstrSessionId并将其设置为 SSOCookie 数据。 这段代码处理了登录态检查的回调结果根据结果码的不同执行不同的逻辑。成功的情况下会设置事件以通知等待的线程而失败的情况下会记录错误信息和处理错误码。 在前一个代码段中设置异步是为了执行后台的异步操作以防止阻塞主线程。主要的原因是某些操作可能需要等待网络请求或其他耗时操作的结果而如果在主线程中同步执行这些操作会导致应用程序的界面无响应给用户带来不好的体验。 ResetEvent 和 SetEvent 函数本身不会阻塞线程。它们是用于线程同步的事件对象的操作函数。 ResetEventResetEvent 用于将事件对象的状态设置为非信号状态无信号这不会阻塞线程。当事件对象处于非信号状态时线程在调用等待函数如 WaitForSingleObject 时如果事件仍然是非信号状态线程将会被阻塞等待事件变为有信号状态。 SetEventSetEvent 用于将事件对象的状态设置为信号状态有信号同样它本身不会阻塞线程。当事件对象变为有信号状态时任何线程在等待这个事件的时候使用等待函数会被唤醒继续执行。 所以ResetEvent 和 SetEvent 主要用于线程同步它们的阻塞效果是在等待函数如 WaitForSingleObject中体现的而不是在它们自身的调用中。这两个函数是协调线程之间的操作以实现正确的同步行为。 当一个线程调用等待函数如 WaitForSingleObject等待一个事件对象时如果事件对象的状态是非信号状态那么线程将被阻塞即暂时停止执行等待事件变为有信号状态。 事件对象的状态可以是两种 信号状态Signaled表示事件已经发生或就绪可以通知等待的线程继续执行。当事件对象处于信号状态时等待它的线程会被唤醒继续执行相关的逻辑。 非信号状态Non-Signaled表示事件尚未发生或尚未就绪等待的线程需要等待事件变为信号状态才能继续执行。当事件对象处于非信号状态时等待它的线程会被阻塞暂停执行直到事件被设置为信号状态。 所以当一个线程等待一个事件对象并且事件对象处于非信号状态时线程将被阻塞直到其他线程调用 SetEvent 来将事件设置为信号状态此时等待的线程会被唤醒继续执行。这是一种线程同步的机制用于协调多个线程的操作。 如果没有 ResetEvent 和 SetEvent但有 WaitForSingleObject 调用那么 WaitForSingleObject 会一直等待因为事件对象的状态不会发生改变。具体情况取决于事件对象的初始状态 如果事件对象的初始状态是非信号状态那么调用 WaitForSingleObject 会立即阻塞线程将一直等待直到其他某个线程调用 SetEvent 将事件对象的状态设置为信号状态。 如果事件对象的初始状态是信号状态那么调用 WaitForSingleObject 不会阻塞线程将立即继续执行不需要等待。 在没有 ResetEvent 和 SetEvent 的情况下WaitForSingleObject 只是对事件对象的当前状态进行检查并根据该状态来决定是否阻塞线程。如果事件对象的状态一直保持不变那么 WaitForSingleObject 将一直等待下去可能导致线程挂起。 通常情况下ResetEvent 用于初始化事件对象的状态将其设置为非信号状态然后等待的线程可以通过 WaitForSingleObject 阻塞等待事件变为有信号状态。SetEvent 用于在某个条件得到满足时将事件设置为信号状态唤醒等待的线程使它们可以继续执行。这是一种用于线程同步的常见机制。 在这个特定的情况中CAuthenManager::GetAccountState 函数中的异步操作是等待登录状态的检查这个操作可能需要一些时间才能完成。因此通过将异步操作设置为等待事件 m_hEventLs该函数可以在等待的过程中允许主线程或其他线程继续执行而不会被阻塞。 一旦异步操作完成通过 ::SetEvent(sm_pAuthenManager-m_hEventLs)事件会被触发通知主线程或等待的线程以便它们可以继续执行相关的逻辑。 这种异步操作的设置允许应用程序保持响应性同时执行需要一些时间的操作以提高用户体验。 onExtendLoginStateCallback 是一个回调函数它的目的是处理异步操作的结果并在需要的时候触发事件 sm_pAuthenManager-m_hEventLs 以通知等待事件的线程可以继续执行。如果没有 ::SetEvent(sm_pAuthenManager-m_hEventLs); 这段代码等待事件的线程将不会被通知事件的触发因此不会执行后续逻辑。 具体来说如果没有这段代码onExtendLoginStateCallback 回调函数将仍然执行并会设置结果码 nResultCode但等待事件的线程将一直等待不会被唤醒。因此后续逻辑不会被执行等待事件的线程将一直阻塞在等待事件的地方导致应用程序无法继续执行所需的操作。 所以::SetEvent(sm_pAuthenManager-m_hEventLs); 这段代码是确保等待事件的线程能够被唤醒并执行后续逻辑的关键部分。 3、WaitForSingleObject 代码定义: WINBASEAPI DWORD WINAPI WaitForSingleObject(__in HANDLE hHandle,__in DWORD dwMilliseconds);代码解释: WaitForSingleObject 是 Windows API 中用于等待一个内核对象如事件、互斥、信号量等的函数。它会阻塞当前线程直到指定的内核对象处于有信号状态或者等待超时。 该函数的参数包括 hHandle要等待的内核对象的句柄可以是事件、互斥、信号量等。dwMilliseconds等待的超时时间以毫秒为单位。如果为零表示立即返回不等待如果为 INFINITE表示永久等待直到对象变为有信号状态。 WaitForSingleObject 的返回值包括 WAIT_OBJECT_0对象变为有信号状态。WAIT_ABANDONED对象为互斥对象且之前拥有该互斥对象的线程意外终止导致互斥对象的计数不再准确。通常情 况下应用程序需要谨慎处理此返回值。WAIT_TIMEOUT等待超时对象未变为有信号状态。WAIT_FAILED等待失败可以调用 GetLastError 函数获取错误代码。 WaitForSingleObject 是多线程编程中用于线程同步的重要函数之一。它允许一个线程等待另一个线程通知某个事件的发生或者等待某个资源的可用性。通过合理使用超时参数和返回值可以实现不同的等待策略例如等待直到对象变为有信号状态、等待一段时间后超时返回、等待一段时间后轮询等。 举个例子: if (WAIT_TIMEOUT WaitForSingleObject(m_hEventLs, GET_TICKET_TIME_OUT SECOND_GET_TICKET_TIME_OUT)){TRACEE(AM -- g.tkt -- timeout!);return SDOL_ERRORCODE_GETTICKET_TIMEOUT;}return get_account_state_error_code;代码解释: 这段代码的逻辑是首先等待事件对象 m_hEventLs如果等待超时即事件未在规定时间内触发就会执行以下逻辑 打印错误消息使用 TRACEE 函数输出 “AM – g.tkt – timeout!”表示发生了等待超时。 返回错误代码 SDOL_ERRORCODE_GETTICKET_TIMEOUT表示等待超时错误。 如果事件在规定时间内触发WaitForSingleObject 不返回 WAIT_TIMEOUT那么代码会跳过上述两个步骤直接执行 return get_account_state_error_code;返回 get_account_state_error_code这个值可能是在 onExtendLoginStateCallback 回调函数中设置的。 这段代码的作用是等待事件如果事件超时未触发则返回一个特定的错误代码否则返回 get_account_state_error_code 的值这个值可能在事件触发后的回调函数中设置。 4、WaitForMultipleObjects 代码定义: WINBASEAPI DWORD WINAPI WaitForMultipleObjects(__in DWORD nCount,__in_ecount(nCount) CONST HANDLE *lpHandles,__in BOOL bWaitAll,__in DWORD dwMilliseconds);代码解释: WaitForMultipleObjects 也是 Windows API 中用于等待多个内核对象的函数它允许一个线程等待多个对象中的任何一个或全部。具体而言它等待一个对象数组中的多个内核对象之一或所有内核对象都变为有信号状态。 该函数的参数包括 nCount要等待的内核对象句柄数组中的对象数目。lpHandles一个包含要等待的内核对象句柄的数组。bWaitAll一个布尔值如果为 TRUE则只有当数组中的所有对象都变为有信号状态时函数才会返回如果为 FALSE则只要数组中的任何一个对象变为有信号状态函数就会返回。dwMilliseconds等待的超时时间以毫秒为单位。如果为零表示立即返回不等待如果为 INFINITE表示永久等待直到对象变为有信号状态。 WaitForMultipleObjects 的返回值包括 WAIT_OBJECT_0 到 WAIT_OBJECT_0 nCount - 1对象数组中的某个对象变为有信号状态。如果 bWaitAll 为 FALSE则返回的值表示数组中的哪个对象发生了变化如果 bWaitAll 为 TRUE则返回 WAIT_OBJECT_0。WAIT_TIMEOUT等待超时对象数组中的任何一个对象都未变为有信号状态。WAIT_FAILED等待失败可以调用 GetLastError 函数获取错误代码。 通过合理使用参数可以实现多种等待策略如等待任何一个对象变为有信号状态、等待所有对象都变为有信号状态、等待一段时间后超时返回等。这个函数在多线程编程和处理多个并发事件时非常有用。
http://www.pierceye.com/news/542643/

相关文章:

  • 网站正能量视频不懂我意思吧wordpress readme
  • 石家庄网站seo优化站长工具ip地址
  • 网站运行速度慢一个网站做三页是什么意思
  • wordpress视频网站企炬网站
  • 做数据收集网站租一个服务器多少钱
  • 苏州网站制作推广网站改版 删除栏目
  • 电子商务网站开发需求文档怎样建自己的网站
  • 通过关键词优化提升企业网站个人 可以做网站备案吗
  • 山西百度公司做网站的网站监控的软件怎么做
  • 如何做一份企业网站网站调用微博
  • 电子商务网站的设计工具wordpress中文用户名
  • 网站免费下载软件软件著作权申请多少钱一个
  • 东莞网站视频网站建设和管理规则
  • 内网网站建设方案wordpress 开发主题
  • 咸阳网站建设联系电话星悦做任务网站是
  • 家居网站建设的背景及意义免费域名注册官网
  • 桂林网站制作多少钱排名优化seo
  • 将网站保存怎么做wordpress 后台菜单
  • 2.0网站线上建设什么意思做外贸网站哪家的好
  • 网站域名可以更改吗安装wordpress插件目录下
  • 海南省澄迈住房和城乡建设厅网站ui设计师创意平台
  • 青岛网站设计公司排名wordpress 下载主题
  • 外包做网站不满意中级经济师考试成绩查询
  • 苏州企业网站建站系统网页制作基础步骤
  • 新河网站规划电子商务网站流程
  • 免费网站建设免代码杭州建设工程交易平台
  • 网页网站导读怎么做百度问答兼职怎么做
  • wordpress建站环境报喜鸟集团有限公司网页制作
  • 怎么利用网站赚广告费网站开发服务费入什么科目
  • 求网站2021在线观看设计app的软件