c语言多线程,C语言能实现多线程么
c语言多线程,C语言能实现多线程么详细介绍
本文目录一览: C语言能实现多线程么
可以通过调用C语言函数库pthread里的函数,创建多线程。
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
C语言最初并未设计多线程的机制,随着软硬件的发展及需求的发展,C语言才开发了线程库以支持多线程的操作和应用。
c语言实现多线程
package cn.sdeit.file;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.Scanner;public class ReadTxt{ private int id; public String getArticle(String path,int id) { String url = path+id+".txt"; String string = ""; String allString = ""; File file=new File(url); try { BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"utf-8")); while((string=reader.readLine())!=null) { allString += string+"\r\n"; } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return allString; }}
目录:Linux操作系统,C语言实现多线程
Windows操作系统,C语言实现多线程
Windows下的多线程(不带停止)
Linux操作系统,C语言实现多线程:#include
#include
#include
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
#include
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
#include
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语言多线程的操作步骤
线程创建函数原型: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语言如何实现多线程同时运行
1、点击菜单栏的“Project”选项卡,下拉列表的最后一项“Project options...”是对当前工程的的属性进行设置的。
2、选择弹出对话框中的“Compiler”选项卡。
3、将其中的“Runtime Library”的选择改为“Multithreaded (LIB)”。
4、将看到对话框最下面的文本框中发生了一些变化,新增了“-MT”选项,这与编译器一开始所报的错误提示给出的解决方案一致。
5、页面的设置完成后,再对该源码进行编译时,就能愉快地看到编译完全成功。
C语言多线程的优势
线程程序作为一种多任务、并发的工作方式,当然有其存在优势:提高应用程序响应:这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。使多CPU系统更加有效:操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。改善程序结构:一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
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语言加密接口支持多线程方式调用吗
支持。根据查询csdn官网得知,在加密接口中,多线程可以用于同时处理多个加密请求,提高加密效率。多线程是一种并发执行的方式,可以同时执行多个线程,提高程序的的处理速度和效率。在C语言中,使用多线程需要调用操作系统提供的多线程库,如POSIX线程库(pthread)或Windows线程库(WindowsThreads)。
[高分,急]C语言,如何实现多线程,有具体方案,请提供!
这是Windows上的实现,主要是使用
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全属性指针
SIZE_T dwStackSize, // 初始堆栈大小
LPTHREAD_START_ROUTINE lpStartAddress, // 线程函数
LPVOID lpParameter, // 线程参数
DWORD dwCreationFlags, // 创建选项
LPDWORD lpThreadId // 线程标识符
);
函数,示例代码如下:
#include
//包含了CreateThread函数的声明
#include
//控制台相关输入输出函数的声明
DWORD WINAPI ThreadFunc( LPVOID lpParam ) //新线程将从这里开始执行
{
char szMsg[80];
//以下语句是在另一个线程中执行的,因此并不会因为主线程
//main函数的_getch()而挂起
wsprintf( szMsg, "Parameter = %d.", *(DWORD*)lpParam );
MessageBox( NULL, szMsg, "ThreadFunc", MB_OK );
return 0;
}
VOID main( VOID )
{
DWORD dwThreadId, dwThrdParam = 1;
HANDLE hThread;
char szMsg[80];
hThread = CreateThread(
NULL, // 安全属性为空
0, // 使用默认堆栈大小
ThreadFunc, // 在main之前声明的线程入口
&dwThrdParam, // ThreadFunc函数的参数
0, // 使用默认线程创建标志
&dwThreadId); // 该线程的标识符将储存于dwThreadId中
// 根据CreateThread的返回值判断线程创建是否成功.
if (hThread == NULL)
{
wsprintf( szMsg, "CreateThread failed." );
MessageBox( NULL, szMsg, "main", MB_OK );
}
else
{
_getch();//主线程暂停在此处,直到用户有输入动作
CloseHandle( hThread ); //主线程执行到此处,关闭子线程句柄
}
}
_beginthread,_beginthreadex
千万不要用CreateThread,你会后悔的
不懂
你这个问题可是超过200分的啊,
这个往大了说是一个比较复杂的设计方案。
实际上C语言是没有多线程的概念的,但是我们可以通过Task来实现多任务。
简单的说,可以采取以下方案:
定义一个主Task,将其置为常驻Task,用以进行Task调度和Task的启动/终了和交互的管理。
定义一个Task优先级列表,用优先级来作为Task调度和管理的基础。
定义一个共享域,和相应的事件分发/广播/传递的管理机制,由主Task来实现各Task间的事件传递。
定义3个List,实现Active,Ready,Dead的Task的管理和调度。
定义各普通Task,包含Task基本信息:Task的栈指针,Task情报,Task存储空间大小,Task的优先级,Task的事件列表(定义可以接收/发送的事件,以及可以排队的事件的个数),以及如果需要的话可以定义Task的从属(父子)关系。
另外还有几个注意点:
1. 通过C的临界域(critical section)结合PV操作来实现某些Task的原子性处理要求。
2. 通过Signal来实现中断和再开
3. 如果需要处理中断和再开的话,一定要注意现场保护
4. 同优先级的Task可以通过时间片轮循的方式进行多任务实现
暂时就想到这么多,有不明白的通过消息进一步交流吧:)
c语言中怎样创建多线程?
/*这是我写的最简单的多线程程序,看懂不?*/
#include
#include
//#include
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语言如何实现多线程同时运行的情况下,各个线程输出不同的随机数?
你用 (系统时间 - 线程 id*10) 作种子 就可以了。
种子变了,随机数系列就会变。
或 一个线程种子用 srand(1234); 另一个用 srand(4321); ...
加 系统时间 目的是 每次跑程序 随机数系列不同,更符合“随机”。
1、使用pthread库执行多线程,这个是Linux下的线程库 Windows下应该有自己的API,不过这种东西一般还是以Linux为标准。pthread_create()创建一个线程,传入fun()的函数指针就行了。然后这个Beep()的需求要进行线程间通信,可以用共享内存的方法,设一个bool变量flag共享,然后beep的时候设为false,beep完设成true。fun()里面每次看一下这个flag,是false的话就不做动作等下一秒,基本可以满足需求。
2、例程:
#include
#include
#include
#include
#define MAX 10pthread_t thread[2];pthread_mutex_t mut;int number=0, i;void *thread1(){printf ("thread1 : I'm thread 1\n");for (i = 0; i < MAX; i++){printf("thread1 : number = %d\n",number);pthread_mutex_lock(&mut);number++;pthread_mutex_unlock(&mut);sleep(2);}printf("thread1 :主函数在等我完成任务吗?\n");pthread_exit(NULL);}void *thread2(){printf("thread2 : I'm thread 2\n");for (i = 0; i < MAX; i++){printf("thread2 : number = %d\n",number);pthread_mutex_lock(&mut);number++;pthread_mutex_unlock(&mut);sleep(3);}printf("thread2 :主函数在等我完成任务吗?\n");pthread_exit(NULL);}void thread_create(void){int temp;memset(&thread, 0, sizeof(thread)); //comment1/*创建线程*/if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) //comment2printf("线程1创建失败!\n");elseprintf("线程1被创建\n");if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0) //comment3printf("线程2创建失败");elseprintf("线程2被创建\n");}void thread_wait(void){/*等待线程结束*/if(thread[0] !=0) { //comment4pthread_join(thread[0],NULL);printf("线程1已经结束\n");}if(thread[1] !=0) { //comment5pthread_join(thread[1],NULL);printf("线程2已经结束\n");}}int main(){/*用默认属性初始化互斥锁*/pthread_mutex_init(&mut,NULL);printf("我是主函数哦,我正在创建线程,呵呵\n");thread_create();printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");thread_wait();return 0;}