您的位置:首页 > 其它

MutilThread -- 线程的创建、执行、挂起和退出

2013-05-14 21:38 260 查看
一、线程相关API介绍

在多线程操作系统中,进程是资源分配的最小单位,线程是处理器调度的最小单位,进程分配的CPU时间片又会按优先级分配给各个子线程。适当的使用多线程可以有效缩短程序完成任务的时间。在UI编程中,需要很长时间执行的后台程序放在线程中,可以保持UI界面对用户的响应。

1.创建线程:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD(安全属性)
SIZE_T dwStackSize,                       // initial stack size
LPTHREAD_START_ROUTINE lpStartAddress,    // thread function(VOID *ThreadProc(PVOID))
LPVOID lpParameter,                       // thread argument
DWORD dwCreationFlags,                    // creation option (决定创建之后是立即执行还是挂起)
LPDWORD lpThreadId                        // thread identifier
);
2.挂起线程:
VOID Sleep(
DWORD dwMilliseconds   // sleep time
);
3.退出/终止线程:
VOID ExitThread(     // 退出当前线程
DWORD dwExitCode   // exit code for this thread
);
BOOL TerminateThread(     // 在主线程中结束指定线程,导致目标线程退出,使用时要注意。
HANDLE hThread,    // handle to thread
DWORD dwExitCode   // exit code
);

4.获取/设置线程优先级:
int GetThreadPriority(
HANDLE hThread   // handle to thread
);
BOOL SetThreadPriority(
HANDLE hThread, // handle to the thread
int nPriority   // thread priority level
);
线程优先级nPriority参数取值,线程优先级和线程的基本优先级共同决定当前线程可以分配到多少CPU时间片。

#define THREAD_PRIORITY_LOWEST          THREAD_BASE_PRIORITY_MIN
#define THREAD_PRIORITY_BELOW_NORMAL    (THREAD_PRIORITY_LOWEST+1)     // 正常之下,比最低优先级高1级
#define THREAD_PRIORITY_NORMAL          0                              // 正常
#define THREAD_PRIORITY_HIGHEST         THREAD_BASE_PRIORITY_MAX
#define THREAD_PRIORITY_ABOVE_NORMAL    (THREAD_PRIORITY_HIGHEST-1)    // 正常之上,比最高优先级低1级
#define THREAD_PRIORITY_ERROR_RETURN    (MAXLONG)

#define THREAD_PRIORITY_TIME_CRITICAL   THREAD_BASE_PRIORITY_LOWRT
#define THREAD_PRIORITY_IDLE            THREAD_BASE_PRIORITY_IDLE

5.获取当前线程/线程ID:

HANDLE GetCurrentThread(VOID);             // 获取当前线程句柄

DWORD GetCurrentThreadId(VOID);            // 获取当前线程ID

6.示例代码:

下面代码演示了上面的部分函数的使用方法,主线程是执行main函数,main函数中创建了两个线程分别执行两个函数,这两个函数功能基本相同打印从1到传入的int参数。
#include <stdio.h>
#include <windows.h>

DWORD ThdProc1(PVOID param)
{
int times = *(int *)param;
int i;
for (i = 0; i < times; ++i)
{
Sleep(1);
printf("Thread 1: %d\n", i);
if(i == times/2)
{
//Exit thread with DWORD type code which can be got by GetExitCodeThread() function.
ExitThread(99);
}
}
}

DWORD ThdProc2(PVOID param)
{
int times = *(int *)param;
int i;
for (i = 0; i < times; ++i)
{
Sleep(1);
printf("Thread 2: %d\n", i);
}
}

int main(int argc, char *argv[])
{
HANDLE handle1,handle2;
DWORD dwIDThread, dwExitCode;
int times = 100;
// Create a thread.
handle1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThdProc1, (PVOID)×, 0, &dwIDThread);
// Set thread priority
SetThreadPriority(handle1, THREAD_PRIORITY_LOWEST);
// Create a thread with suspend state.It will not run utill the ResumeThread function is called.
handle2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThdProc2, (PVOID)×, 0, &dwIDThread);
// Suspend the primary thread a while.
Sleep(times * 3);
// Get the exit code setted by handle1
GetExitCodeThread(handle1, &dwExitCode);
printf("Thread1 exit with code:%d\n", dwExitCode);
// Get thread priority
printf("Thread1 priority:%d\n", GetThreadPriority(handle1));
printf("Thread2 priority:%d\n", GetThreadPriority(handle2));
// Resume the suspended thread.
// Note: need the handle2 have the THREAD_SUSPEND_RESUME access to the thread.see the Thread Security and Access rights
//ResumeThread(handle2);
return 0;
}


二、C语言启用线程函数

微软对C run-time library的扩充使其支持线程_beginthread和_endthread,是指更容易使用,这些函数定义在process.h头文件中。
unsigned long _beginthread( void( __cdecl *start_address )( void * ), // 在线程中执行的函数地址
unsigned   stack_size,     // 分配线程堆栈大小,置0使用默认
void *     arglist );      // 传入线程执行函数的的参数地址
void _endthread( void );          // 终止当前线程

下面代码演示如何使用,示例代码:
#include <stdio.h>
#include <process.h>

void ThdProc(void *pParam)
{
int times = *(int *)pParam;
int i;
for (i = 0; i < times; ++i)
{
printf("Thread 1: %d\n", i);
}
// End current thread.
_endthread();
}

int main(int argc, char *argv[])
{
int nTimes = 100;
int i;
// Begin a new thread
_beginthread(ThdProc, 0, &nTimes);

for (i = 0; i < nTimes*2; ++i)
{
printf("Thread 2: %d\n", i);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐