首页编程c语言 多线程,c语言实现多线程

c语言 多线程,c语言实现多线程

编程之家2023-11-03106次浏览

大家好,关于c语言 多线程很多朋友都还不太明白,今天小编就来为大家分享关于c语言实现多线程的知识,希望对各位有所帮助!

c语言 多线程,c语言实现多线程

C语言能实现多线程么

可以通过调用C语言函数库pthread里的函数,创建多线程。

多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

C语言最初并未设计多线程的机制,随着软硬件的发展及需求的发展,C语言才开发了线程库以支持多线程的操作和应用。

C语言多线程的操作步骤

线程创建

c语言 多线程,c语言实现多线程

函数原型:intpthread_create(pthread_t*restrict tidp,const pthread_attr_t*restrict attr,void*(*start_rtn)(void),void*restrict arg);

返回值:若是成功建立线程返回0,否则返回错误的编号。

形式参数:pthread_t*restrict tidp要创建的线程的线程id指针;const pthread_attr_t*restrict attr创建线程时的线程属性;void*(start_rtn)(void)返回值是void类型的指针函数;void*restrict arg start_rtn的形参。

线程挂起:该函数的作用使得当前线程挂起,等待另一个线程返回才继续执行。也就是说当程序运行到这个地方时,程序会先停止,然后等线程id为thread的这个线程返回,然后程序才会断续执行。

函数原型:intpthread_join(pthread_tthread, void**value_ptr);

参数说明如下:thread等待退出线程的线程号;value_ptr退出线程的返回值。

c语言 多线程,c语言实现多线程

返回值:若成功,则返回0;若失败,则返回错误号。

线程退出

函数原型:voidpthread_exit(void*rval_ptr);

获取当前线程id

函数原型:pthread_tpthread_self(void);

互斥锁

创建pthread_mutex_init;销毁pthread_mutex_destroy;加锁pthread_mutex_lock;解锁pthread_mutex_unlock。

条件锁

创建pthread_cond_init;销毁pthread_cond_destroy;触发pthread_cond_signal;广播pthread_cond_broadcast;等待pthread_cond_wait。

C语言多线程的优势

线程程序作为一种多任务、并发的工作方式,当然有其存在优势:

提高应用程序响应:

这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。

使多CPU系统更加有效:

操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。

改善程序结构:

一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

c语言实现多线程

目录:

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);

returnNULL;

}

intmain(void)

{

pthread_tThreadID;/*记录线程标识符*/

void*waitingResult;/*等待线程退出的等待结果*/

interrorCode;/*记录线程的错误代码*/

char*aMessage="这是线程的参数";

/*创建并启动线程ThreadOne。若返回值非零,则线程创建失败*/

errorCode=pthread_create(&ThreadID,NULL,ThreadOne,aMessage);

if(errorCode!=0)

{

printf("线程ThreadOne创建失败。错误代码:%d\n",errorCode);

returnEXIT_FAILURE;

}

/*等待线程标识符为的ThreadID的线程结束*/

errorCode=pthread_join(ThreadID,&waitingResult);

if(errorCode!=0)

{

printf("等待线程退出等待失败。错误代码:%d\n",errorCode);

returnEXIT_FAILURE;

}

printf("线程的返回值是%p\n",waitingResult);

returnEXIT_SUCCESS;

}Windows操作系统,C语言实现多线程:

#include<stdio.h>

#include<windows.h>

DWORDAPIENTRYThreadOne(LPVOIDthreadArg)

{

printf("线程开始啦,参数是:%s\n",(char*)threadArg);

return0;

}

intmain(void)

{

HANDLEhThread;/*记录线程句柄*/

DWORDThreadID;/*记录线程ID号*/

DWORDwaitingResult;/*等待线程退出的等待结果*/

DWORDthreadExitCode;/*记录线程的返回值*/

char*aMessage="这是线程的参数";

/*创建并启动线程ThreadOne,返回值为线程句柄,赋值给hThread*/

hThread=CreateThread(NULL,0L,ThreadOne,(LPVOID)aMessage,0L,&ThreadID);

if(hThread==NULL)

{

printf("线程ThreadOne创建失败。错误代码:%lu\n",GetLastError());

returnEXIT_FAILURE;

}

/*等待线程句柄为的hThread线程结束*/

waitingResult=WaitForSingleObject(hThread,INFINITE);

if(waitingResult==WAIT_FAILED)

{

printf("等待线程退出等待失败。错误代码:%lu\n",GetLastError());

returnEXIT_FAILURE;

}

if(GetExitCodeThread(hThread,&threadExitCode))

printf("线程的返回值是%lu\n",threadExitCode);

else

printf("获取线程的返回值获取失败。错误代码:%lu\n",GetLastError());

returnEXIT_SUCCESS;

}Windows下的多线程:(不带停止)

#include<stdio.h>

#include<windows.h>

DWORDWINAPIduoxianchen(LPVOIDlpParam);

intmain(intargc,char*argv[])

{

intnum=0;

CreateThread(NULL,NULL,duoxianchen,&num,NULL,NULL);

while(1)

{

num++;

printf("主线程!%05d\n",nu***eep(40);

}

return0;

}

DWORDWINAPIduoxianchen(LPVOIDlpParam)

{

int*a=lpParam;

while(1)

{

++*a;

printf("副线程!%05d0x%p\n",*a,a);

Sleep(80);

}

return0;

}

END,本文到此结束,如果可以帮助到大家,还望关注本站哦!

付费企业邮箱?企业邮箱有免费的吗香港华纳(华纳唱片公司老板是谁)