1、添加线程相关的头文件:#include<pthread.h>
2、线程创建函数是pthread_create()函数,该函数的原型为:
int pthread_create(pthread_t *thread,pthread_attr_t *attr,void* (*start_routine)(void*),void *arg)3、线程退出函数是pthread_exit()函数,该函数的原型为:
void pthread_exit(void *retval)创建线程的示例程序如下:
/***程序说明:创建线程函数pthread_create()函数的使用。
*/
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
//打印标识符的函数
void print_ids(const char *str)
{
pid_t pid //进程标识符
pthread_t tid //线程标识符
pid=getpid() //获得进程号
tid=pthread_self() //获得线程号
printf("%s pid:%u tid:%u (0x%x)\n",
str,(unsigned int)pid,(unsigned int)tid,(unsigned int)tid) //打印进程号和线程号
}
//线程函数
void* pthread_func(void *arg)
{
print_ids("new thread:") //打印新建线程号
return ((void*)0)
}
//主函数
int main()
{
int err
pthread_t ntid //线程号
err=pthread_create(&ntid,NULL,pthread_func,NULL) //创建一个线程
if(err != 0)
{
printf("create thread failed:%s\n",strerror(err))
exit(-1)
}
print_ids("main thread:") //打印主线程号
sleep(2)
return 0
}
通常使用CreateThread函数来创建新的线程.(Unix下使用pthread_create函数)首先指出,线程与线程之间,是并列关系,不会存在"父子线程"的概念.
在Windows平台下,CreateThread函数包含在 Windows.h 文件内,包含此文件即可正常使用.
以下为CreateThread函数的声明:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//指向安全性属性描述结构体的
//指针,通常可以忽略的.
SIZE_T dwStackSize,//指定新线程初始的栈大小,若不关心,可以用0填充,来要求使用
//默认值
LPTHREAD_START_ROUTINE lpStartAddress,//用来充当线程的函数的指针.
LPVOID lpParameter,//要传递给函数的参数,这个值本身就是那个参数,而不是参数的地址
DWORD dwCreationFlags,//创建的方式,0表示正常,创建后立即开始运行
LPDWORD lpThreadId//用来接受函数反馈的线程ID的指针.
)
用来充当新的线程的函数格式:
DWORD WINAPI ThreadProc(LPVOID)
CreateThread函数若成功了,返回新线程的句柄,若失败了,则返回NULL.
若用CREATE_SUSPENDED填充dwCreation Flags则创建的线程先挂起来,并不直接开始运行,要用ResumeThread函数恢复线程,才能继续运行.
目录:Linux操作系统,C语言实现多线程
Windows操作系统,C语言实现多线程
Windows下的多线程(不带停止)
Linux操作系统,C语言实现多线程: #include <stdio.h>#include <stdlib.h>
#include <pthread.h>
void * ThreadOne ( void * threadArg )
{
printf ( "线程开始啦,参数是:%s\n" , (char *)threadArg )
return NULL
}
int main ( void )
{
pthread_t ThreadID /* 记录线程标识符 */
void * waitingResult /* 等待线程退出的等待结果 */
int errorCode /* 记录线程的错误代码 */
char * aMessage = "这是线程的参数"
/* 创建并启动线程ThreadOne。若返回值非零,则线程创建失败 */
errorCode = pthread_create( &ThreadID, NULL, ThreadOne, aMessage )
if ( errorCode != 0 )
{
printf ("线程ThreadOne创建失败。错误代码:%d\n", errorCode )
return EXIT_FAILURE
}
/* 等待线程标识符为的ThreadID的线程结束 */
errorCode = pthread_join( ThreadID, &waitingResult )
if ( errorCode != 0 )
{
printf ( "等待线程退出等待失败。错误代码:%d\n" , errorCode )
return EXIT_FAILURE
}
printf( "线程的返回值是%p\n", waitingResult )
return EXIT_SUCCESS
} Windows操作系统,C语言实现多线程: #include <stdio.h>
#include <windows.h>
DWORD APIENTRY ThreadOne ( LPVOID threadArg )
{
printf ( "线程开始啦,参数是:%s\n" , (char *)threadArg )
return 0
}
int main ( void )
{
HANDLE hThread /* 记录线程句柄 */
DWORD ThreadID /* 记录线程ID号 */
DWORD waitingResult /* 等待线程退出的等待结果 */
DWORD threadExitCode /* 记录线程的返回值 */
char * aMessage = "这是线程的参数"
/* 创建并启动线程ThreadOne,返回值为线程句柄,赋值给hThread */
hThread = CreateThread ( NULL, 0L, ThreadOne, (LPVOID)aMessage, 0L, &ThreadID )
if ( hThread == NULL )
{
printf ("线程ThreadOne创建失败。错误代码:%lu\n", GetLastError() )
return EXIT_FAILURE
}
/* 等待线程句柄为的hThread线程结束 */
waitingResult = WaitForSingleObject ( hThread, INFINITE )
if ( waitingResult == WAIT_FAILED )
{
printf ( "等待线程退出等待失败。错误代码:%lu\n" , GetLastError() )
return EXIT_FAILURE
}
if ( GetExitCodeThread ( hThread , &threadExitCode ) )
printf ( "线程的返回值是%lu\n", threadExitCode )
else
printf ( "获取线程的返回值获取失败。错误代码:%lu\n" , GetLastError() )
return EXIT_SUCCESS
} Windows下的多线程:(不带停止) #include <stdio.h>
#include <windows.h>
DWORD WINAPI duoxianchen(LPVOID lpParam)
int main(int argc, char *argv[])
{
int num=0
CreateThread(NULL,NULL,duoxianchen,&num,NULL, NULL)
while(1)
{
num++
printf("主线程! %05d\n",nu***eep(40)
}
return 0
}
DWORD WINAPI duoxianchen(LPVOID lpParam)
{
int* a=lpParam
while(1)
{
++*a
printf("副线程! %05d 0x%p\n",*a,a)
Sleep(80)
}
return 0
}