线程同步
文件名:main.cpp
编译方法: gcc main.cpp -o testthread -lpthread
#include<stdio.h>
#include<pthread.h>
#include <unistd.h>
pthread_mutex_t mutlock;
pthread_cond_t condt;
void Init()
{
pthread_mutex_init(&mutlock,NULL);
pthread_cond_init(&condt,NULL);
}
void ActiveThread()
{
pthread_cond_signal(&condt);
}
void * ProcessThread(void * para)
{
printf("entry process thread");
while(true)
{
pthread_mutex_lock(&mutlock);
pthread_cond_wait(&condt, &mutlock) ;
printf("processing...\n");
//sleep(2); //second
usleep(2000000); // suspend execution for microsecond intervals
printf("over\n");
pthread_mutex_unlock(&mutlock);
}
return 0;
}
void * CheckThread(void * para)
{
while(true)
{
usleep(200);
ActiveThread();
}
return 0;
}
int main()
{
pthread_t tidCheck;
pthread_t tidProcess;
Init();
if(pthread_create(&tidCheck, NULL, CheckThread, NULL) == 0)
{
printf("CheckThread create OK!\n");
}
if(pthread_create(&tidProcess, NULL, ProcessThread, NULL) == 0)
{
printf("Process thread create OK!\n");
}
if(pthread_join(tidCheck, NULL) != 0)
{
printf("cann't join the thread");
}
if(pthread_join(tidProcess, NULL) != 0)
{
printf("cann't join the thread");
}
return 0;
}
得知ProcessThread线程的工作状态
pthread_cond_wait函数说明
它会先将参数中的锁解锁。然后等待激活信号。等到激活信号后,在次锁定此锁。也就是说,在上面的代码上,锁处于打开状态只有两种可能:
1、执行完了锁定段代码
2、线程处于等待状态。
由此可知,对于上面的代码,只要判断锁的状态,就可以知道,ProcessThread线程是否完成了工作。可以使用trylock函数,检测ProcessThread线程的工作状态。代码如下:
#include<stdio.h>
#include<pthread.h>
#include <unistd.h>
pthread_mutex_t mutlock;
pthread_cond_t condt;
void Init()
{
pthread_mutex_init(&mutlock,NULL);
pthread_cond_init(&condt,NULL);
}
void ActiveThread()
{
pthread_cond_signal(&condt);
}
void * ProcessThread(void * para)
{
printf("entry process thread");
while(true)
{
pthread_mutex_lock(&mutlock);
pthread_cond_wait(&condt, &mutlock) ;
printf("processing...\n");
//sleep(2); //second
usleep(2000000); // suspend execution for microsecond intervals
printf("over\n");
pthread_mutex_unlock(&mutlock);
}
return 0;
}
void * CheckThread(void * para)
{
int ret = 0;
while(true)
{
usleep(1000000);
ret = pthread_mutex_trylock(&mutlock);
//printf("%d\n", ret);
if(ret == 0)
{
printf("idle...\n");
pthread_mutex_unlock(&mutlock);
}
else if(ret == 16) //EBUSY=16
{
printf("busy...\n");
}
ActiveThread();
}
return 0;
}
int main()
{
pthread_t tidCheck;
pthread_t tidProcess;
Init();
if(pthread_create(&tidCheck, NULL, CheckThread, NULL) == 0)
{
printf("CheckThread create OK!\n");
}
if(pthread_create(&tidProcess, NULL, ProcessThread, NULL) == 0)
{
printf("Process thread create OK!\n");
}
if(pthread_join(tidCheck, NULL) != 0)
{
printf("cann't join the thread");
}
if(pthread_join(tidProcess, NULL) != 0)
{
printf("cann't join the thread");
}
return 0;
}
windows版本如下
#include <windows.h>
#include <stdio.h>
CRITICAL_SECTION criSection;
HANDLE m_hActiveEvent;
DWORD WINAPI WorkThread( LPVOID lpParam);
DWORD WINAPI CheckThread( LPVOID lpParam);
HANDLE aThread[2];
int main()
{
InitializeCriticalSection(&criSection);
m_hActiveEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
DWORD ThreadID;
aThread[0] = CreateThread(
NULL, // default security attributes
0, // default stack size
(LPTHREAD_START_ROUTINE)WorkThread,
NULL, // no thread function arguments
0, // default creation flags
&ThreadID); // receive thread identifier
aThread[1] = CreateThread(
NULL, // default security attributes
0, // default stack size
(LPTHREAD_START_ROUTINE)CheckThread,
NULL, // no thread function arguments
0, // default creation flags
&ThreadID); // receive thread identifier
WaitForMultipleObjects(2, aThread, TRUE, INFINITE);
// Close thread and mutex handles
for(int i=0; i < 2; i++ )
CloseHandle(aThread[i]);
DeleteCriticalSection(&criSection);
}
DWORD WINAPI WorkThread( LPVOID lpParam )
{
int iCount = 0;
while(true)
{
printf("waiting ...%d\n", iCount);
WaitForSingleObject(m_hActiveEvent, INFINITE); //未触发状态时 线程挂起
iCount++;
printf("processing ...\n");
EnterCriticalSection(&criSection);
Sleep(10*1000);
ResetEvent(m_hActiveEvent);
LeaveCriticalSection(&criSection);
}
}
DWORD WINAPI CheckThread( LPVOID lpParam )
{
BOOL ret;
while(true)
{
Sleep(1*1000);
ret = TryEnterCriticalSection(&criSection);
//printf("%d\n", ret);
if(ret == TRUE)
{
printf("idle...\n");
SetEvent(m_hActiveEvent); //ActiveThread
LeaveCriticalSection(&criSection);
}
else//EBUSY
{
printf("busy...\n");
}
}
}
pthread_mutex_trylock 解释见如下网址。
http://www.mkssoftware.com/docs/man3/pthread_mutex_trylock.3.asp