C++多线程怎么实现?C语言如何实现多线程同时运行
本文目录
- C++多线程怎么实现
- C语言如何实现多线程同时运行
- c++ 多线程编程常用的几个函数
- C语言多线程的操作步骤
- C语言多线程的优势
- c语言如何编写一个简单的多线程程序
- c的多线程实现
- C语言多线程的概念
- c语言实现多线程
- c/c++如何进行网络编程、多线程编程
C++多线程怎么实现
C++多线程也可以使用UNIX C的库函数,pthread_mutex_t,pthread_create,pthread_cond_t,pthread_detach,pthread_mutex_lock/unlock,等等。在使用多线程的时候,你需要先创建线程,使用pthread_create,你可以使主线程等待子线程使用pthread_join,也可以使线程分离,使用pthread_detach。线程使用中最大的问题就是同步问题,一般使用生产着消费者模型进行处理,使用条件变量pthread_cond_t,pthread_mutex,pthread_cond_wait来实现。别人说再多也是别人的,自己看书或者Google去吧。
C语言如何实现多线程同时运行
1、点击菜单栏的“Project”选项卡,下拉列表的最后一项“Project options...”是对当前工程的的属性进行设置的。
2、选择弹出对话框中的“Compiler”选项卡。
3、将其中的“Runtime Library”的选择改为“Multithreaded (LIB)”。
4、将看到对话框最下面的文本框中发生了一些变化,新增了“-MT”选项,这与编译器一开始所报的错误提示给出的解决方案一致。
5、页面的设置完成后,再对该源码进行编译时,就能愉快地看到编译完全成功。
c++ 多线程编程常用的几个函数
1、C++多线程也可以使用UNIX C的库函数,pthread_mutex_t,pthread_create,pthread_cond_t,pthread_detach,pthread_mutex_lock/unlock,等等。在使用多线程的时候,你需要先创建线程,使用pthread_create,你可以使主线程等待子线程使用pthread_join,也可以使线程分离,使用pthread_detach。线程使用中最大的问题就是同步问题,一般使用生产着消费者模型进行处理,使用条件变量pthread_cond_t,pthread_mutex,pthread_cond_wait来实现。2、例程://创建5个线程#include 《pthread.h》#include 《stdlib.h》void* work_thread(void* arg){//线程执行体return 0;}int main(int argc,char* argv){int nthread = 5;//创建线程的个数pthread_t tid;//声明一个线程ID的变量;for(int i=0;i《nthread;i++){pthread_create(&tid,NULL,work_thread,NULL);}sleep(60);//睡眠一分钟,你可以看下线程的运行情况,不然主进程会很快节结束了。}pthread_create(&tid,NULL,work_thread,NULL);//创建线程的函数,第一个参数返回线程的ID;第二个参数是线程的属性,一般都置为NULL;第三个参数是线程函数,线程在启动以后,会自动执行这个函数;第四个参数是线程函数的参数,如果有需要传递给线程函数的参数,可以放在这个位置,可以是基础类型,如果你有不止一个参数想传进线程函数,可以做一个结构体,然后传入。
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退出线程的返回值。返回值:若成功,则返回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线程的控制和通信你 生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。 缓冲区有N个,是一个环形的缓冲池。 */#include 《stdio.h》#include 《pthread.h》#define BUFFER_SIZE 16struct prodcons{ int buffer;/*实际存放数据的数组*/ pthread_mutex_t lock;/*互斥体lock,用于对缓冲区的互斥操作*/ int readpos,writepos; /*读写指针*/ pthread_cond_t notempty;/*缓冲区非空的条件变量*/ pthread_cond_t notfull;/*缓冲区未满 的条件变量*/};/*初始化缓冲区*/void pthread_init( struct prodcons *p){ pthread_mutex_init(&p-》lock,NULL); pthread_cond_init(&p-》notempty,NULL); pthread_cond_init(&p-》notfull,NULL); p-》readpos = 0; p-》writepos = 0;}/*将产品放入缓冲区,这里是存入一个整数*/void put(struct prodcons *p,int data){ pthread_mutex_lock(&p-》lock); /*等待缓冲区未满*/ if((p-》writepos +1)%BUFFER_SIZE ==p-》readpos) { pthread_cond_wait(&p-》notfull,&p-》lock); } p-》buffer =data; p-》writepos++; if(p-》writepos 》= BUFFER_SIZE) p-》writepos = 0; pthread_cond_signal(&p-》notempty); pthread_mutex_unlock(&p-》lock);}/*从缓冲区取出整数*/int get(struct prodcons *p){ int data; pthread_mutex_lock(&p-》lock); /*等待缓冲区非空*/ if(p-》writepos == p-》readpos) { pthread_cond_wait(&p-》notempty ,&p-》lock);//非空就设置条件变量notempty } /*读书据,移动读指针*/ data = p-》buffer; p-》readpos++; if(p-》readpos == BUFFER_SIZE) p-》readpos = 0; /*设置缓冲区未满的条件变量*/ pthread_cond_signal(&p-》notfull); pthread_mutex_unlock(&p-》lock); return data;} /*测试:生产站线程将1 到1000的整数送入缓冲区,消费者线程从缓冲区中获取整数,两者都打印信息*/#define OVER (-1)struct prodcons buffer;void *producer(void *data){ int n; for( n=0;n《1000;n++) { printf("%d ------》\n",n); put(&buffer,n); } put(&buffer,OVER); return NULL;}void *consumer(void *data){ int d; while(1) { d = get(&buffer); if(d == OVER) break; else printf("-----》%d\n",d); } return NULL;}int main(){ pthread_t th_p,th_c; void *retval; pthread_init(&buffer); pthread_create(&th_p,NULL,producer,0); pthread_create(&th_c,NULL,consumer,0); /*等待两个线程结束*/ pthread_join(th_p, &retval); pthread_join(th_c,&retval); return 0;}
c的多线程实现
#include 《stdio.h》#include 《pthread.h》void thread(void){int i;for(i=0;i《3;i++)printf("This is a pthread.\n");}int main(void){pthread_t id;int i,ret;ret=pthread_create(&id,NULL,(void *) thread,NULL);if(ret!=0){printf ("Create pthread error!\n");exit (1);}for(i=0;i《3;i++)printf("This is the main process.\n");pthread_join(id,NULL);return (0);}不算是双核优化哈!也不是并发处理,如果真的让多线程发挥到极致就用多核经较好
C语言多线程的概念
线程:线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。多线程:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。C语言的开始设计,并未设计多线程的机制,由于随着软硬件的发展及需求的发展。后来C语言才开发了线程库以支持多线程的操作、应用。主要基于Linux介绍C多线程。在编译C的多线程时候,一方面必须指定Linux C语言线程库多线程库pthread,才可以正确编译(例如:gcc test.c -o test -lpthread);另一方面要包含有关线程头文件#include 《pthread.h》。
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 ); 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;}
c/c++如何进行网络编程、多线程编程
每个平台有自己的实现而已,大体意思都一编程先要了解逻辑和思想,至于api 那只是每个平台为了实现功能提供的接口而已。
比如网络编程,你要知道什么是阻塞,非阻塞,同步,异步的概念,了解了这些以后,再去关注你想学习的系统,比如linux下的非阻塞模型,select,poll,epoll
比如windows下的select,iocp
再比如多线程,你要了解什么是多线程,什么是锁,什么是线程同步,知道可这些以后你才能了解如何创建线程,什么情况下加什么锁等等
了解思想是第一步,api是第二步
其实c++11已经在多线程方面有很大改善,可以做到跨平台
还有boost 学下其中的asio 那么网络编程也能实现跨平台
更多文章:
xt800刷机后怎么恢复([求救]向高手求救:XT800刷机后循环开机,无法进入系统!)
2024年5月27日 07:24
一加手机发布会(一加、OPPO官宣合并,“父子团圆”能否拯救一加)
2024年9月20日 14:30
三星w2014电池(三星w2014一直显示电量是100 怎么回事,求解)
2024年5月1日 14:42
华为maters保时捷升级鸿蒙系统(2022年mate20rs还能升级鸿蒙系统吗)
2023年11月28日 02:50
华为p30pro能用5g网络吗(华为p30pr0支持5g吗)
2024年1月30日 17:15
三星a905g手机是双卡双待吗(三星a905gWFi是双模吗)
2023年10月7日 20:15
三星堆出土的文物多为哪种材质为主(三星堆文化出土了哪些陶器)
2024年10月7日 16:30
荣耀6plus多大屏幕(华为荣耀6plus屏幕尺寸多少谢谢啦)
2024年5月15日 20:02
先锋手机c1(先锋c1手机如何,参数呢,运行内存,手机内存,与BF_T18手机相比,我买)
2023年8月17日 00:30
oppo find x3销量(OPPO手机哪个型号销量最好)
2024年7月24日 05:42
一加9pro和华为mate40pro(华为Mate40Pro和一加9Pro哪个好-华为Mate40Pro和一加9Pro区别)
2024年6月24日 21:40
三星s8000手机闪光灯亮的电筒软件(三星手机的手电筒在哪里打开)
2024年7月23日 15:33