C++ rtmp livestream 流媒体

海阔天空 张翼飞翔

我的学习笔记。--我喜欢这里,因为这里安静,无广告骚扰。
随笔 - 82, 文章 - 2, 评论 - 126, 引用 - 0
数据加载中……

多线程及线程互斥

Linux线程 互斥运行
在编译中请加-lpthread参数,例如:
g++ -c name.c
g++ -o name name.o -lpthread

/*事例代码*/

#include  " pthread.h "
#include 
" stdio.h "
pthread_mutex_t mutex;
void *  thread_test( void *  ptr)
{  
 pthread_mutex_lock(
& mutex);
 printf(
" test " );
 pthread_mutex_unlock(
& mutex);
}

int  main()
{
 pthread_t pid;
 pthread_mutex_init (
& mutex,NULL);
 pthread_create(
& pid, NULL, test_thread, NULL);
 
return   0 ;
}



Win32线程 互斥运行

#include  < iostream >
#include 
< windows.h >

static  HANDLE g_handle;
static   int  g_nThreadID  = 0 ;
static   void *  ThreadProc( void *  param)
{
 
int   * =  ( int * )param;
 
int  currentThread  =  g_nThreadID ++ ;
 WaitForSingleObject(g_handle, INFINITE); 
// 开始互斥
  for  ( int  i = 0 ; i < 5 ; i ++
 
{  
  (
* p) ++ ;
  printf(
" Thread[%d] %d\n " ,currentThread, * p);
  Sleep(
500 );
 }

 ReleaseMutex(g_handle);
// 解锁
 Sleep( 100 );
 printf(
" Thread[%d] return\n " ,currentThread);
 
return   0 ;
}


int  main(  void  )
{
 
int  n = 0 ;
 g_handle 
=  CreateMutex(NULL,FALSE,NULL); // 第四个参数为字符串表示进程间互斥
 CreateThread(NULL,  0 , (LPTHREAD_START_ROUTINE)ThreadProc,  & n,  0 , NULL);
 CreateThread(NULL, 
0 , (LPTHREAD_START_ROUTINE)ThreadProc,  & n,  0 , NULL);
 CreateThread(NULL, 
0 , (LPTHREAD_START_ROUTINE)ThreadProc,  & n,  0 , NULL);
 getchar();
  
return   0 ;
}


Win32线程 利用事件互斥运行

#include  < iostream >
#include 
< windows.h >

static  HANDLE g_handle;
static   int  g_nThreadID  = 0 ;
static   void *  ThreadProc( void *  param)
{
 
int   * =  ( int * )param;
 
int  currentThread  =  g_nThreadID ++ ;
 WaitForSingleObject(g_handle, INFINITE); 
// 等待事件(互斥)
  for  ( int  i = 0 ; i < 5 ; i ++
 
{  
  (
* p) ++ ;
  printf(
" Thread[%d] %d\n " ,currentThread, * p);
  Sleep(
500 );

 }

 SetEvent(g_handle);
// 发送事件(解锁)
 Sleep( 100 );
 printf(
" Thread[%d] return\n " ,currentThread);
 
return   0 ;
}


int  main(  void  )
{
 
int  n = 0 ;
 g_handle 
=  CreateEvent(NULL, FALSE, TRUE, NULL); // 第三个参数表示初始状态,第四个参数为字符串表示进程间互斥
 CreateThread(NULL,  0 , (LPTHREAD_START_ROUTINE)ThreadProc,  & n,  0 , NULL);
 CreateThread(NULL, 
0 , (LPTHREAD_START_ROUTINE)ThreadProc,  & n,  0 , NULL);
 CreateThread(NULL, 
0 , (LPTHREAD_START_ROUTINE)ThreadProc,  & n,  0 , NULL);
 getchar();
  
return   0 ;
}


Win32线程 利用MFC的CMutex类互斥运行

#include  < afxmt.h >

int  g_nThreadID  =   0 ;
CMutex g_mutex(FALSE,NULL);
// 第一个参数表示初始状态FALSE=解锁状态,第二个参数为字符串表示进程间互斥NULL=线程间互斥

static   void *  ThreadProc( void *  param)
{
 
int   * =  ( int * )param;
 
int  currentThread  =  g_nThreadID ++ ;
 g_mutex.Lock();
// 加锁
  for  ( int  i = 0 ; i < 5 ; i ++
 
{  
  (
* p) ++ ;
  printf(
" Thread[%d] %d\n " ,currentThread, * p);
  Sleep(
500 );
 }

 g_mutex.Unlock();
// 解锁
 Sleep( 100 );
 printf(
" Thread[%d] return\n " ,currentThread);
 
return   0 ;
}


int  Run()
{
 
int  n = 0 ;
 CreateThread(NULL, 
0 , (LPTHREAD_START_ROUTINE)ThreadProc,  & n,  0 , NULL);
 CreateThread(NULL, 
0 , (LPTHREAD_START_ROUTINE)ThreadProc,  & n,  0 , NULL);
 CreateThread(NULL, 
0 , (LPTHREAD_START_ROUTINE)ThreadProc,  & n,  0 , NULL);
 getchar();
 
return   0 ;
}


CreateMutex()和CMutex一样都是对线程间的临界区加互斥锁,即使在该线程内部加多少次锁,同一线程内部的方法都可以反复进入该临界区。
如果线程不终止,则解锁次数和加锁次数必须一致才能完全解锁。
线程结束后该线程加的所有锁会自动解开,可以不必一一解锁。
例如下面代码,g_mutex.Lock();二次被执行仍然可以继续进入临界区域。

HANDLE g_handle = CreateMutex(NULL,FALSE,NULL);
static void* ThreadProc(void* param)
{
 int nThreadID = g_nThreadID++; 
 for (int i=0; i<2; i++)
 {
  WaitForSingleObject(g_handle, INFINITE); //即使多次加锁,同一线程仍然可以进入临界区
  printf("threadID=%d do=%d\n",nThreadID,i);
  Sleep(100); 
 } 
 ReleaseMutex(g_handle);//解锁
 ReleaseMutex(g_handle);//解锁
 getchar(); 
 return 0;
}

CreateEvent()方法利用事件互斥运行,一旦加锁,不管是否在同一线程都必须等待一个唤醒事件才能解锁。
线程结束后该线程加的所有等待的事件不能自动解开.

HANDLE g_handle = CreateEvent(NULL, FALSE, TRUE, NULL);
static void* ThreadProc(void* param)
{
 int nThreadID = g_nThreadID++; 
 for (int i=0; i<2; i++)
 {
  WaitForSingleObject(g_handle, INFINITE); //等待事件 (会死锁)
  printf("threadID=%d do=%d\n",nThreadID,i);
  Sleep(100);  
 } 
 SetEvent(g_handle);//发送事件
 SetEvent(g_handle);//发送事件
 getchar(); 
 return 0;
}

posted on 2008-03-27 12:13 ZhangEF 阅读(472) 评论(0)  编辑  收藏 所属分类: C/C++CodeSocket