c 多线程(C语言怎样实现多线程)

2025-03-23 07:50:02 0

c  多线程(C语言怎样实现多线程)

本文目录

C语言怎样实现多线程

首先你要有控制蛇移动方向的全局变量(定义在main以外因为线程函数也要调用它,每次键盘输入都会修改它的值), 比如 char direction ’a’ ==左 ’w’ == 右 ’d’==上 ’s’ == 下,然后你在移动时应该是在while里面操作的吧,你每移动一步前都读一下direction这个变量的数值然后再控制移动方向(注意s这个键可以忽略因为不会倒着走) 然后你可以用pthread.h这个库 例子是 pthread t;// 定义一个线程 pthread_create(&t, null, listen_keyboard_input, null);//建立线程执行listen_keyboard_input这个函数 这个线程执行的函数 void listen_keyboard_input(){ while(应该通过某个信号来退出这个循环,从而表示游戏结束){ direction =getchar(); } } 但是这里存在同步问题, 比如当这个线程的getchar()在给direction辅助的同时,你控制贪吃蛇移动的线程正在调用 direction的值来判断下一个移动方向,这就会出问题,所以要加一个锁,叫 mutex lock;这个也定义成全局变量可以使各线程共享。 pthread_mutex_t mutex; //定义一个锁 pthread_mutex_init(&mutex, null, null);//初始化 然后把函数修改成 void listen_keyboard_input(){ while(应该通过某个信号来退出这个循环,从而表示游戏结束){ pthread_mutex_lock(&mutex); direction =getchar(); pthread_mutex_unlock(&mutex); } } 另外一个控制贪吃蛇移动的时候也要加锁 while(.....){ char c; pthread_mutex_lock(&mutex); c = direction; pthread_mutex_unlock(&mutex); switch(c){ ................ } ................................... } 这样就好了 注意你的控制贪吃蛇移动的部分也必须要放在另外一个pthread 里面执行,如果放在主线程, 主线程会一直等listen_keyboard_input而什么事都不会做 你把这两个线程用 pthread_create 创建完成后 用 t1.join(); t2.join(); 就可以使这两个线程并发执行了 如果你用的是linux 来编译的,你再输入gcc 指令后加上 -lpthread 就可以了 还有什么不懂的你可以多找找 pthread 类的例子

c语言多线程问题

#include 《stdio.h》#include 《process.h》#include 《windows.h》long g_nNum; //全局资源unsigned int __stdcall Fun(void *pPM); //线程函数const int THREAD_NUM = 10; //子线程个数int main(){ g_nNum = 0; HANDLE handle = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL); i++;//等子线程接收到参数时主线程可能改变了这个i的值 } //保证子线程已全部运行结束 WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE); return 0;}unsigned int __stdcall Fun(void *pPM){//由于创建线程是要一定的开销的,所以新线程并不能第一时间执行到这来 int nThreadNum = *(int *)pPM; //子线程获取参数 Sleep(75);//some work should to do g_nNum++; //处理全局资源 Sleep(1);//some work should to do printf(“线程编号为%d 全局资源值为%d\n“, nThreadNum, g_nNum); getch(); return 0;}

C语言多线程的优势

线程程序作为一种多任务、并发的工作方式,当然有其存在优势:提高应用程序响应:这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。使多CPU系统更加有效:操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。改善程序结构:一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

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语言中怎样创建多线程

/*这是我写的最简单的多线程程序,看懂不?*/#include 《windows.h》#include 《stdio.h》//#include 《strsafe.h》DWORD WINAPI ThreadProc1( LPVOID lpParam ) { int i=0,j=0; while(1) { printf(“hello,this thread 1 ...\n“); //延时 for(i=0;i《200000000;i++) { ; } }} DWORD WINAPI ThreadProc2( LPVOID lpParam ) { int i=0,j=0; while(1) { printf(“hello,this thread 2 ...\n“); //延时 for(i=0;i《200000000;i++) { ; } }} void main(){ int i=0; //创建线程1 CreateThread( NULL, // default security attributes 0, // use default stack size ThreadProc1, // thread function NULL, // argument to thread function 0, // use default creation flags NULL); // returns the thread identifier //创建线程2 CreateThread( NULL, // default security attributes 0, // use default stack size ThreadProc2, // thread function NULL, // argument to thread function 0, // use default creation flags NULL); // returns the thread identifier //让主线程进入循环,主线程若退出,子线程1,2会被系统“杀死” while(1) { printf(“hello,this thread 0 ...\n“); //延时 for(i=0;i《200000000;i++) {;} }}

C语言如何实现多线程同时运行

1、点击菜单栏的“Project”选项卡,下拉列表的最后一项“Project options...”是对当前工程的的属性进行设置的。

2、选择弹出对话框中的“Compiler”选项卡。

3、将其中的“Runtime Library”的选择改为“Multithreaded (LIB)”。

4、将看到对话框最下面的文本框中发生了一些变化,新增了“-MT”选项,这与编译器一开始所报的错误提示给出的解决方案一致。

5、页面的设置完成后,再对该源码进行编译时,就能愉快地看到编译完全成功。

c语言实现多线程

目录:

  1. Linux操作系统,C语言实现多线程

  2. Windows操作系统,C语言实现多线程

  3. 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语言函数库pthread里的函数,创建多线程。 多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。 C语言最初并未设计多线程的机制,随着软硬件的发展及需求的发展,C语言才开发了线程库以支持多线程的操作和应用。

c语言如何编写一个简单的多线程程序

这是一个多线程例子,里面只有两个线程,是生产者/消费者模式,已编译通过,注释很详细,如下:/* 以生产者和消费者模型问题来阐述Linux线程的控制和通信你 生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。 缓冲区有N个,是一个环形的缓冲池。 */#include 《stdio.h》#include 《pthread.h》#define BUFFER_SIZE 16struct prodcons{ int 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  多线程(C语言怎样实现多线程)

本文编辑:admin

更多文章:


comfortablely(seat什么意思 comfortable和comfortablely的词性 谢谢)

comfortablely(seat什么意思 comfortable和comfortablely的词性 谢谢)

本文目录seat什么意思 comfortable和comfortablely的词性 谢谢comfortable的副词形式seat什么意思 comfortable和comfortablely的词性 谢谢seatn. 席位,座位; 所在地; 场

2025年3月11日 13:30

competencies(competence 和competency的区别翻译句子)

competencies(competence 和competency的区别翻译句子)

本文目录competence 和competency的区别翻译句子competencies是什么意思process competencies什么意思competence 和competency的区别翻译句子大隐于市为您解答1、前者倾向于本身

2025年4月1日 15:30

gathering翻译(翻译几句话,很简单,但是请用人工翻译,谢谢)

gathering翻译(翻译几句话,很简单,但是请用人工翻译,谢谢)

本文目录翻译几句话,很简单,但是请用人工翻译,谢谢family gathering是什么意思Gathering leads to harmony求大哥翻译一下不要翻译软件的死板翻译gathering enjoy英语语法难题翻译几句话,很简单

2025年3月11日 00:50

thanks吗(thanks可以单独用吗)

thanks吗(thanks可以单独用吗)

本文目录thanks可以单独用吗thank的名词形式是thanks吗thank能作为名词使用吗和thanks有什么区别thanks是什么的缩写,是thank you吗那thank him,thank her可以吗对于人家英语的春节祝福,应该

2025年3月29日 17:40

html怎么显示表单提交的内容(html 表单提交的信息怎么查看)

html怎么显示表单提交的内容(html 表单提交的信息怎么查看)

本文目录html 表单提交的信息怎么查看如何通过html页面得到提交的表单的内容HTML中如何使用html表单提交的操作html 表单提交的信息怎么查看通过请求request中获取。表单中有很多的控件。当表达提交时,客户端会将这些控件的na

2025年2月13日 00:40

leaden(boss和leader到底有什么区别)

leaden(boss和leader到底有什么区别)

本文目录boss和leader到底有什么区别后缀加en的是什么词lead是什么意思leaden怎么解释boss和leader到底有什么区别leader 英 第三人称单数:experts 复数:experts 现在分词:expertin

2025年2月11日 20:20

gets和getchar区别(c语言中,gets()和puts()函数与getchar()与putchar()函数有何区别)

gets和getchar区别(c语言中,gets()和puts()函数与getchar()与putchar()函数有何区别)

本文目录c语言中,gets()和puts()函数与getchar()与putchar()函数有何区别解释一下C语言getc gets getchar scanf 区别C语言中gets,getchar,strlen分别有什么作用,又有何区别简

2025年3月30日 20:00

bigdecimal初始化为0(mybaits中的BigDecimal的值到底是NULL还是0)

bigdecimal初始化为0(mybaits中的BigDecimal的值到底是NULL还是0)

本文目录mybaits中的BigDecimal的值到底是NULL还是0为什么BigDecimal格式的10/100得数为0java中的new BigDecimal(0)是什么意思mybaits中的BigDecimal的值到底是NULL还是0

2025年3月15日 20:50

java面试笔试经典编程题(Java面试题)

java面试笔试经典编程题(Java面试题)

本文目录Java面试题求:JAVA程序员面试题java面试中的编程题一道JAVA面试笔试题,很经典的!Java面试题java面试笔试题大汇总 JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无

2025年2月20日 01:10

python防止反编译(python如何防止反编译)

python防止反编译(python如何防止反编译)

本文目录python如何防止反编译python 原理及用法python源码编程成pyc后,怎么防止反编译pyinstaller打包后的python的exe软件怎么加壳加密python反编译遇到的新问题,求解python如何防止反编译Pyth

2025年2月27日 16:30

元数据的定义?什么是元数据 是数据库中的概念 请不要说的太深奥 举一个有代表性的例子来说明

元数据的定义?什么是元数据 是数据库中的概念 请不要说的太深奥 举一个有代表性的例子来说明

本文目录元数据的定义什么是元数据 是数据库中的概念 请不要说的太深奥 举一个有代表性的例子来说明什么是元数据(MetaData)及元数据可以分为哪几类什么是元数据什么叫元数据什么是元数据为何需要元数据追本溯源“元数据”,如何理性认识元数据元

2025年2月18日 00:30

云计算好学吗(大数据云计算学习难度大么)

云计算好学吗(大数据云计算学习难度大么)

本文目录大数据云计算学习难度大么云计算好学吗应该从哪入手云计算好学吗学习云计算,难吗云计算难不难本人大学学得计算机,有一定的基础大数据云计算容易学么没有基础,可以学云计算专业吗,学起来是不是很难大家学习云计算难吗云计算难学吗大数据云计算学习

2025年4月2日 17:00

queue是什么意思翻译(英语翻译 排队用英文怎么说)

queue是什么意思翻译(英语翻译 排队用英文怎么说)

本文目录英语翻译 排队用英文怎么说queue什么意思queue译成中文是什么英语单词queue的来历是什么queue怎么记忆英语翻译 排队用英文怎么说首先,我们可以用“stand in line”来表示. 另外我们也可以用“wait in

2025年2月9日 12:40

临清狮子猫繁育基地(哪里有卖山东狮子猫的)

临清狮子猫繁育基地(哪里有卖山东狮子猫的)

本文目录哪里有卖山东狮子猫的狮子猫的介绍临清狮猫的历史溯源哪里有卖山东狮子猫的宠物店,淘宝店上有。临清狮猫(学名:Linqing Lion Cat)别称:山东狮子猫,俗称狮猫、临清猫,系清末临清城区回族群众用波斯猫与本地猫杂交选育的稀世品种

2025年2月18日 15:00

association标签(mybatis怎么根据id显示两个表的内容连接的小例子有哪些)

association标签(mybatis怎么根据id显示两个表的内容连接的小例子有哪些)

本文目录mybatis怎么根据id显示两个表的内容连接的小例子有哪些MyBatis,collection标签和association标签的区别什么mybatis怎么根据id显示两个表的内容连接的小例子有哪些可以通过关系映射查询出来 请看下面

2025年4月2日 00:30

password翻译中文(Password中文什么意思)

password翻译中文(Password中文什么意思)

本文目录Password中文什么意思密码的英文是什么Password中文什么意思password:英音:[’pɑ:sw?:d]美音:[’pæs,w?d]名词n.口令;密码;通行密码;暗语。Password造句:1、The pas

2025年2月18日 21:20

group dynamics(组织行为学 翻译)

group dynamics(组织行为学 翻译)

本文目录组织行为学 翻译几个关于opinion的短语组织行为学 翻译Courses on organizational behavioural research organizations and individual, group and

2025年2月26日 16:50

lambda表达式原理(c#什么时候使用lambda)

lambda表达式原理(c#什么时候使用lambda)

本文目录c#什么时候使用lambda浅谈如何使用 Lambda 表达式做抽象代表为什么 Kotlin 调用 java 时可以使用 Lambda有哪些好的Java的lambda表达式用法/原理文章/书籍等资料java中的lambda没有ret

2025年2月12日 05:10

menu是什么意思?电脑显示器上的menu是什么意思

menu是什么意思?电脑显示器上的menu是什么意思

本文目录menu是什么意思电脑显示器上的menu是什么意思menu怎么读menu是啥menu怎么念EXCEL运行VB宏定义时产生错误“5”MFC中,怎么让弹出菜单的某一个菜单项变灰(不可用)menu是什么意思意思是:菜单英 ['menju:

2025年3月3日 11:10

ssh框架是什么(SSH2框架的含义每个技术的作用是什么)

ssh框架是什么(SSH2框架的含义每个技术的作用是什么)

本文目录SSH2框架的含义每个技术的作用是什么老师要求我的计算机毕业设计要用SSH框架做我学得不是很好,什么是SSH我的题目是拍卖网站的设计ssh框架是什么东西,有什么用,请通俗点说,谢谢(^o^)ssh框架的区别是什么 他们各自负责的功能

2025年2月11日 02:20

近期文章

本站热文

harbor,port,pier的区别?谁能解释“harbour“(港口)与“pier“(码头)的区别
2025-02-22 17:40:03 浏览:18
ibatis foreach(ibatis 批量update操作)
2025-02-10 23:40:06 浏览:7
endless rain(endless rain表达什么情感)
2025-02-14 06:00:02 浏览:6
标签列表

热门搜索