C++多线程(三)
2010-09-30 11:23
127 查看
多线程同步之Critical Sections(功能与Mutex相同,保证某一时刻只有一个线程能够访问共享资源,但是不是内核对象,所以访问速度要比Mutex快,但是增没有等待超时的功能,所以有可能会导致死锁,使用时可以根据实际的情况选择其一)
一 Critical Sections
1) 因为Critical Sections不是内核对象,所以只能用来统一进程内线程间的同步,不能用来多个不同进程间的线程的同步。
2) 如果在Critical Sections中间突然程序crash或是exit而没有调用LeaveCriticalSection,则结果是改线程所对应的内核不能被释放,该线程成为死线程。
3) 要比其他的内核对象的速度要快。
二 使用CriticalSections的简单实例,Stack在push的时候可以分为3个步骤,看下面的代码,但是如果在第2步后此线程中断切换到其他的线程,其他的线程push后再返回执行时,此线程继续执行,这样有可能刚才其他线程push就会被覆盖了,在stack里找不到了。(下面的代码在debug下使用了CriticalSection,release下可能有问题)
一 Critical Sections
1) 因为Critical Sections不是内核对象,所以只能用来统一进程内线程间的同步,不能用来多个不同进程间的线程的同步。
2) 如果在Critical Sections中间突然程序crash或是exit而没有调用LeaveCriticalSection,则结果是改线程所对应的内核不能被释放,该线程成为死线程。
3) 要比其他的内核对象的速度要快。
二 使用CriticalSections的简单实例,Stack在push的时候可以分为3个步骤,看下面的代码,但是如果在第2步后此线程中断切换到其他的线程,其他的线程push后再返回执行时,此线程继续执行,这样有可能刚才其他线程push就会被覆盖了,在stack里找不到了。(下面的代码在debug下使用了CriticalSection,release下可能有问题)
#include <windows.h> #include <process.h> #include <stdio.h> /**////////////////////////////////////////////// //stack: struct Node { struct Node *next; int data; }; struct Stack { struct Node *head; #ifdef _DEBUG CRITICAL_SECTION critical_sec; #endif Stack() { head = NULL; #ifdef _DEBUG InitializeCriticalSection(&critical_sec); #endif } ~Stack() { if(head != NULL) { if(NULL == head->next) { delete head; head = NULL; } else { Node *p = head; Node *q = head->next; while(q != NULL){ delete p; p = q; q = q->next; }; delete p; p = NULL; } } #ifdef _DEBUG DeleteCriticalSection(&critical_sec); #endif } void Push (int num) { //enter critical section, add a new node and then #ifdef _DEBUG EnterCriticalSection (&critical_sec); #endif Node * node = new Node(); node->next = head; node->data = num; head = node; printf("Stack:%d/n",num); //leave critical section #ifdef _DEBUG LeaveCriticalSection (&critical_sec); #endif } int Pop () { #ifdef _DEBUG EnterCriticalSection (&critical_sec); #endif int result = 0; if(head!= NULL) { result = head->data; if(head->next != NULL) { Node *temp = head->next; delete head; head = temp; } else head = NULL; } #ifdef _DEBUG LeaveCriticalSection (&critical_sec); #endif return result; } }; /**/////////////////////////////////////////////////////// //test: unsigned __stdcall Thread1(void * pVoid) { Stack *stack = ((Stack*)pVoid); for(int i = 200; i < 220; ++i) stack->Push(i); return 1; } unsigned __stdcall Thread2(void *pVoid) { Stack *stack = ((Stack*)pVoid); for(int i = 0; i<20; ++i) stack->Push(i); return 1; } int main() { Stack stack; stack.Push(1000); stack.Push(1000); HANDLE hth1; unsigned uiThread1ID; hth1 = (HANDLE)_beginthreadex( NULL, // security 0, // stack size Thread1, (void*)&stack, // arg list CREATE_SUSPENDED, // so we can later call ResumeThread() &uiThread1ID ); if ( hth1 == 0 ) printf("Failed to create thread 1/n"); DWORD dwExitCode; GetExitCodeThread( hth1, &dwExitCode ); // should be STILL_ACTIVE = 0x00000103 = 259 printf( "initial thread 1 exit code = %u/n", dwExitCode ); HANDLE hth2; unsigned uiThread2ID; hth2 = (HANDLE)_beginthreadex( NULL, // security 0, // stack size Thread2, (void*)&stack, // arg list CREATE_SUSPENDED, // so we can later call ResumeThread() &uiThread2ID ); if ( hth2 == 0 ) printf("Failed to create thread 2/n"); GetExitCodeThread( hth2, &dwExitCode ); // should be STILL_ACTIVE = 0x00000103 = 259 printf( "initial thread 2 exit code = %u/n", dwExitCode ); ResumeThread( hth1 ); ResumeThread( hth2 ); WaitForSingleObject( hth1, INFINITE ); WaitForSingleObject( hth2, INFINITE ); GetExitCodeThread( hth1, &dwExitCode ); printf( "thread 1 exited with code %u/n", dwExitCode ); GetExitCodeThread( hth2, &dwExitCode ); printf( "thread 2 exited with code %u/n", dwExitCode ); CloseHandle( hth1 ); CloseHandle( hth2 ); printf("Primary thread terminating./n"); return 0; }
相关文章推荐
- c++多线程3
- C++ 之 CreateThread 与beginThreadex用法具体示例解析 多线程 (三)
- 基于ACE框架---C++多线程开发总结1,涉及 互斥量、读写锁、条件锁、基于条件锁的线程流水控制
- c++多线程基础5(future,async,packaged_task,promise)
- C/C++ Linux下多线程编程 #include <pthread.h>
- C++多线程框架(三)--------- 消息队列
- C++ 多线程 2
- [C/C++标准库]_[初级]_[std::vector的多线程读写问题]
- C++ 浅说Windows多线程临界区域(Critical Section)
- c++多线程
- 多线程的那点儿事07(之C++锁)
- c++多线程(一)
- C++ 多线程
- cocos2d-x 中多线程的c/c++代码通过JNI调用java代码
- 从 C++ 到 Objective-C :异常处理和多线程
- c/c++: 多线程编程基础讲解(五)
- C++之多线程(POSIX多线程实例)
- Linux下C++的多线程编程---(转载)
- 当析构函数遇到多线程 ── C++ 中线程安全的对象回调
- C/C++:多线程下使用dlopen、dlsym、dlclose装载动态库