c 多线程编程(C语言能不能写多线程)

admin 318 0

大家好,今天来为大家分享c 多线程编程的一些知识点,和C语言能不能写多线程的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

一、C++多线程编程要用到哪些库如何编译这些库

1、千万别以为现在的C++没有原生的多线程库

2、OpenMP是一个多线程库,不过他还需要编译器的支持,好在现在绝大多数都已经支持(这个可能是目前最流行的原生多线程库了)

3、C++的标准头process.h(太老的没有,2002年后的基本都有)中有操作进程和执行环境的函数,能实现简单的进程级或线程级并行操作。

4、使用起来非常非常方便。windows平台的C语言编译工具也都有这个头,unix平台上的unistd.h跟这个头很相似,函数名与用法也基本一样。

5、还有一些其他的第三方多线程库,你可以网上搜搜,但是注意是否跨平台等问题

6、如果你要使用操作系统相关的多线程API,那么也就没什么选择余地,windows上只能用windows的多线程API(参考MSDN) unix同理

7、OpenMP的优点是跨平台,功能丰富强大(例如提供了各种锁、信号等),代码改动也比较小,使用起来也非常方便快捷。缺点是没有像直接用系统API时透明感,毕竟使用系统API时,程序员完全控制了逻辑,非常直观,当然这也带来了错误风险和代码复杂度

二、什么是多线程编程

多线程编程技术是Java语言的重要特点。多线程编程的含义是将程序任务分成几个并行的子任务。特别是在网络编程中,你会发现很多功能是可以并发执行的。比如网络传输速度较慢、用户输入速度较慢,你可以用两个独立的线程去完成这两个功能,而不影响正常的显示或其它功能。多线程是与单线程比较而言的,普通的Windows采用单线程程序结构,其工作原理是:主程序有一个消息循环,不断从消息队列中读入消息来决定下一步所要干的事情,一般是针对一个函数,只有等这个函数执行完之后,主程序才能接收另外的消息来执行。比如子函数功能是在读一个网络数据,或读一个文件,只有等读完这个数据或文件才能接收下一个消息。在执行这个子函数过程中你什么也不能干。但往往读网络数据和等待用户输入有很多时间处于等待状态,多线程利用这个特点将任务分成多个并发任务后,就可以解决这个问题。Java中的线程类 1.扩展java.lang.Thread类,用它覆盖Thread类的run方法。 2.生成实现java.lang.Runnable接口的类并将其它的实例与java.lang.Thread实例相关联。 Thread类是负责向其它类提供线程支持的最主要的类,要使用一个类具有线程功能,在Java中只要简单地从Thread类派生一个子类就可以了扩展Thread类,如printThread.java。 Thread类最重要的方法是run方法。run方法是新线程执行的方法,因此生成java.lang.Thread的子类时,必须有相应的run方法。//PrintThread.java public class PrintThread extends Thread//继承Tread类 private int count=0//定义一个count变量用于统计打印的次数并共享变量 public static void mainString args//main方法开始 PrintThread p=new PrintThread//创建一个线程实例 p.start//执行线程 for{;;}//主线程main方法执行一个循环,for执行一个死循环count++ System.out.printcount+″:Main\n″//主线程中打印count+“main”变量的值,并换行 public void run//线程类必须有的run()方法for{;;}count++ System.out.printcount+″:Thread\n″上面这段程序便是继承java.lang.Tread并覆盖run的方法。用Java虚拟机启动程序时,这个程序会先生成一个线程并调用程序主类的main方法。这个程序中的main方法生成新线程,连接打印“Thread”。在启动线程之后,主线程继续打印“Main”。编译并执行这个程序,然后立即按“Ctrl+C”键中断程序,你会看到上面所述的两个线程不断打印出:XXX:main…..XXX:Thread…. XXX代表的是数字,也就是上面count的值。在笔者的机器上,不同时刻这两个线程打印的次数不一样,先打印20个main(也就是先执行20次主线程)再打印出50次Thread,然后再打印main……提示:为了便于查看该程序的执行结果,你可以将执行结果导入一个文本文件,然后打开这个文件查看各线程执行的情况。如运行: javac PrintThread.java Java PrintThread1.txt第一个命令javac PrintThread.java是编译java程序,第二个是执行该程序并将结果导入1.txt文件。当然你可以直接执行命令:java

三、c语言多进程编程

多进程这个词用得比较少,听过来有点不熟悉。你这个程序在linux下应该很容易实行,就是个进程间通信的问题,管道、消息队列、共享内存都可以,可以找找相关资料。昨天失言不好意思。

三个源文件分别为1.c、2.c、3.c一个头文件share.h。

shmid=shmget((key_t)1234,sizeof(share_use),0666|IPC_CREAT);//创建共享内存

fprintf(stderr,"共享内存创建失败!\n");

shared_memory= shmat(shmid,(void*)0,0);//让进程可以访问共享内存

fprintf(stderr,"启用共享内存失败!\n)";

printf("Memory attached at%X\n",(int)shared_memory);

share_stuff=(share_use*)shared_memory;

shmid=shmget((key_t)1234,sizeof(share_use),0666|IPC_CREAT);//创建共享内存

fprintf(stderr,"共享内存创建失败!\n");

shared_memory= shmat(shmid,(void*)0,0);//让进程可以访问共享内存

fprintf(stderr,"启用共享内存失败!\n");

printf("Memory attached at%X\n",(int)shared_memory);

share_stuff=(share_use*)shared_memory;

share_stuff->b[0]=share_stuff->a[0]*100;

share_stuff->b[1]=share_stuff->a[1]*100;

shmid=shmget((key_t)1234,sizeof(share_use),0666|IPC_CREAT);//创建共享内存

fprintf(stderr,"共享内存创建失败!\n");

shared_memory= shmat(shmid,(void*)0,0);//让进程可以访问共享内存

fprintf(stderr,"启用共享内存失败!\n");

printf("Memory attached at%X\n",(int)shared_memory);

share_stuff=(share_use*)shared_memory;

printf("共享内存中有元素:%d,%d",share_stuff->b[0],share_stuff->b[1]);

四、关于C++多线程编程教学

在Windows NT和Windows 9x中,多线程的编程实现需要调用一系列的API函数,如CreateThread、ResumeThread等,比较麻烦而且容易出错。我们使用Inprise公司的新一代RAD开发工具C++Builder,可以方便地实现多线程的编程。与老牌RAD工具Visual Basic和Delphi比,C++Builer不仅功能非常强大,而且它的编程语言是C++,对于系统开发语言是C的Windows系列操作系统,它具有其它编程语言无可比拟的优势。利用C++Builder提供的TThread对象,多线程的编程变得非常简便易用。那么,如何实现呢?且待我慢慢道来,让你体会一下多线程的强大功能。

首先,先介绍一下实现多线程的具体步骤。在C++Builder中虽然用Tthread对象说明了线程的概念,但是Tthread对象本身并不完整,需要在TThread下新建其子类,并重载Execute方法来使用线程对象。在C++Builder下可以很方便地实现这一点。

在C++Builder IDE环境下选择菜单File|New,在New栏中选中Thread Object,按OK,接下来弹出输入框,输入TThread对象子类的名字MyThread,这样C++Builder自动为你创建了一个名为TMyThread的TThread子类。同时编辑器中多了一个名为Unit2.cpp的单元,这就是我们创建的TMyThread子类的原码,如下:

//---------------------

// Important: Methods and properties of objects in VCL can only be

// used in a method called using Synchronize, for example:

// Synchronize(UpdateCaption);

// where UpdateCaption could look like:

// void __fastcall MyThread::UpdateCaption()

// Form1->Caption=“Updated in a thread”;

//--------------------

__fastcall MyThread::MyThread(bool CreateSuspended)

//--------------------

void __fastcall MyThread::Execute()

//---- Place thread code here----

//---------------------

其中的Execute()函数就是我们要在线程中实现的任务的代码所在处。在原代码中包含Unit2.cpp,这个由我们创建的TMyThread对象就可以使用了。使用时,动态创建一个TMyThread对象,在构造函数中使用Resume()方法,那么程序中就增加了一个新的我们自己定义的线程TMyThread,具体执行的代码就是Execute()方法重载的代码。要加载更多的线程,没关系,只要继续创建需要数量的TMyThread对象就成。

关于c 多线程编程和C语言能不能写多线程的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。