最近面试时,碰到一个面试题,题目是有3个线程,顺序打印这三个线程的线程ID多次,例如ABCABC...这样打印。
第一种方法:使用pthread_cond_timedwait或WaitForSingleObject,超时时间到了就打印出线程ID,每个线程设置不同的超时等待时间。
/*
* main.cpp
*
* Created on: 2014年12月27日
* Author: Richard
*/
#include <pthread.h>
#include <time.h>
#include <stdio.h>
pthread_cond_t g_Condition;
pthread_mutex_t g_Mutex;
void *ThreadFunc(void *Param)
{
int WaitTime = *(int *)Param;
for (int i = 0; i < 2; ++i) {
timespec Tm;
clock_gettime(CLOCK_REALTIME, &Tm);
Tm.tv_sec += WaitTime;
pthread_mutex_lock(&g_Mutex);
pthread_cond_timedwait(&g_Condition, &g_Mutex, &Tm);
pthread_mutex_unlock(&g_Mutex);
printf("%lu ", pthread_self());
}
return NULL;
}
int main(int argc, char **argv) {
pthread_cond_init(&g_Condition, NULL);
pthread_mutex_init(&g_Mutex, NULL);
pthread_t ThreadID[3];
int WaitTime[]={3, 4, 5};
for (int i = 0; i < 3; ++i) {
pthread_create(&ThreadID[i], NULL, ThreadFunc, (void *)(&WaitTime[i]));
}
for (int i = 0; i < 3; ++i) {
pthread_join(ThreadID[i], NULL);
}
pthread_cond_destroy(&g_Condition);
pthread_mutex_destroy(&g_Mutex);
return 0;
}
#include <process.h>
#include <stdio.h>
#include <Windows.h>
HANDLE g_Event;
unsigned int __stdcall ThreadFunc(void *Param)
{
int Interval = *(int *)Param;
for (int i = 0; i < 2; i++)
{
WaitForSingleObject(g_Event, Interval);
printf("%d ", GetCurrentThreadId());
}
return 0;
}
int main(int argc, char **argv)
{
g_Event = CreateEvent(NULL, FALSE, FALSE, NULL);
HANDLE Thread[3];
int Interval[3] = {3000, 4000, 5000};
for (int i = 0; i < 3; i++)
{
Thread[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, (void *)&Interval[i], 0, NULL);
}
Sleep(10000);
for (int i = 0; i < 3; i++)
{
CloseHandle(Thread[i]);
}
CloseHandle(g_Event);
system("Pause");
return 0;
}
第二种方法:使用pthread_cond_wait和WaitForSingleObject,WaitForSingleObject不用指定超时时间,使用3个条件变量或Event,主线程中依次调用pthread_cond_signal或SetEvent。
/*
* main.cpp
*
* Created on: 2014年12月27日
* Author: Richard
*/
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
pthread_cond_t g_Condition[3];
pthread_mutex_t g_Mutex;
void *ThreadFunc(void *Param)
{
int Index = *(int *) Param;
for (int i = 0; i < 10; ++i)
{
pthread_mutex_lock(&g_Mutex);
pthread_cond_wait(&g_Condition[Index], &g_Mutex);
pthread_mutex_unlock(&g_Mutex);
printf("%lu ", pthread_self());
}
return NULL;
}
int main(int argc, char **argv)
{
for (int i = 0; i < 3; ++i)
{
pthread_cond_init(&g_Condition[i], NULL);
}
pthread_mutex_init(&g_Mutex, NULL);
pthread_t ThreadID[3];
int Index[] = { 0, 1, 2 };
for (int i = 0; i < 3; ++i)
{
pthread_create(&ThreadID[i], NULL, ThreadFunc, (void *) (&Index[i]));
}
for (int i = 0; i < 10; ++i)
{
for (int j = 0; j < 3; ++j)
{
usleep(100);
pthread_mutex_lock(&g_Mutex);
pthread_cond_signal(&g_Condition[j]);
pthread_mutex_unlock(&g_Mutex);
}
}
for (int i = 0; i < 3; ++i)
{
pthread_join(ThreadID[i], NULL);
}
for (int i = 0; i < 3; ++i)
{
pthread_cond_destroy(&g_Condition[i]);
}
pthread_mutex_destroy(&g_Mutex);
return 0;
}
#include <process.h>
#include <stdio.h>
#include <Windows.h>
HANDLE g_Event[3];
unsigned int __stdcall ThreadFunc(void *Param)
{
int Index = *(int *)Param;
for (int i = 0; i < 10; i++)
{
WaitForSingleObject(g_Event[Index], INFINITE);
printf("%d ", GetCurrentThreadId());
ResetEvent(g_Event[Index]);
}
return 0;
}
int main(int argc, char **argv)
{
HANDLE Thread[3];
int Index[3] = {0, 1, 2};
for (int i = 0; i < 3; i++)
{
g_Event[i] = CreateEvent(NULL, TRUE, FALSE, NULL);
Thread[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, (void *)&Index[i], 0, NULL);
}
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 3; j++)
{
Sleep(300);
SetEvent(g_Event[j]);
}
}
Sleep(2000);
for (int i = 0; i < 3; i++)
{
CloseHandle(g_Event[i]);
CloseHandle(Thread[i]);
}
system("Pause");
return 0;
}