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语言实现多线程
目录:
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语言函数库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;}
更多文章:

comfortablely(seat什么意思 comfortable和comfortablely的词性 谢谢)
2025年3月11日 13:30

competencies(competence 和competency的区别翻译句子)
2025年4月1日 15:30

gathering翻译(翻译几句话,很简单,但是请用人工翻译,谢谢)
2025年3月11日 00:50

html怎么显示表单提交的内容(html 表单提交的信息怎么查看)
2025年2月13日 00:40

gets和getchar区别(c语言中,gets()和puts()函数与getchar()与putchar()函数有何区别)
2025年3月30日 20:00

bigdecimal初始化为0(mybaits中的BigDecimal的值到底是NULL还是0)
2025年3月15日 20:50

元数据的定义?什么是元数据 是数据库中的概念 请不要说的太深奥 举一个有代表性的例子来说明
2025年2月18日 00:30

association标签(mybatis怎么根据id显示两个表的内容连接的小例子有哪些)
2025年4月2日 00:30