多线程编程c实例
A. c语言中 怎么实现双线程 或者 父子线程啊
运行一个程序,这个运行实体就是一个“进程”。
例如,用鼠标双击IE浏览器的图标,你运行了一个IE“进程”。第一个窗未关,你又用鼠标双击IE浏览器的图标,又出来一个浏览器的窗。这时,你运行了同一个程序的两个进程。
对于自己写的程序也如此。运行它,这个运行实体就是一个“进程”。同时运行两个,就是两个进程。计算机分别对两个进程分配资源,直到进程结束,收回资源。
线程是进程里真真跑的线路,真真执行的运算,每个进程有一个主线程。进程里可以开第二第三条新的执行线路,gcc 用 pthread_create(),VC++ 用 CreateThread(), 这就叫双线程和多线程。进程是线程的容器,同一进程的线程共享它们进程的资源。线程里建的线程就是父子线程。
两个或多个进程协同工作时,需要互相交换信息,有些情况下进程间交换的少量信息,有些情况下进程间交换大批信息。这就要通讯。通讯方式不止一种。管道就是一种。VC++ 用 CreatePipe() 函数建立。
管道的实质是一个共享文件,可借助于文件系统的机制实现,创建、打开、关闭和读写.
一个进程正在使用某个管道写入或读出数据时,另一个进程就必须等待. 发送者和接收者双方必须知道对方是否存在,如果对方已经不存在,就没有必要再发送信息.,发送信息和接收信息之间要协调,当写进程把一定数量的数据写入管道,就去睡眠等待,直到读进程取走数据后,把它唤醒。
VC++ 线程例子:
#include <windows.h>
#include <iostream.h>
DWORD WINAPI fun1(LPVOID lp);
DWORD WINAPI fun2(LPVOID lp);
int piao=500;
int main()
{
HANDLE pthread1,pthread2;
pthread1=CreateThread(0,0,fun1,0,0,0);
pthread2=CreateThread(0,0,fun2,0,0,0);
CloseHandle(pthread1);
CloseHandle(pthread2);
Sleep(3000);
return 0;
}
DWORD WINAPI fun1(LPVOID lp)
{
while(1)
{
if(piao>0)
cout<< "thread-1-"<< piao--<<endl;
else
break;
}
return 0;
}
DWORD WINAPI fun2(LPVOID lp)
{
while(1)
{
if(piao>0)
cout<<"thread-2-"<<piao--<<endl;
else
break;
}
return 0;
}
===================================
建管道函数原形:
BOOL CreatePipe(
PHANDLE hReadPipe, // read handle
PHANDLE hWritePipe, // write handle
LPSECURITY_ATTRIBUTES lpPipeAttributes, // security attributes
DWORD nSize // pipe size
);
B. 鍏涓狢璇瑷椤圭洰姣曚笟钖庝粠灏忕槠鍒板ぇ鐗
C璇瑷8涓椤圭洰瀹炶返鐩村斾富棰
涓銆佸熀浜庣栌搴AI镄勮阔宠瘑鍒
闅惧害绯绘暟:
浠g爜閲:400琛
瀹炵幇锷熻兘:璇阔冲綍鍏ャ佽阔宠浆鏂囧瓧
阃傚悎浜虹兢:链塁++銆丵T銆佺绣缁滃熀纭銆
娑夊强鎶链:QT銆佷俊鍙蜂笌妲姐丠TTP銆佺栌搴AI寮鏀惧钩鍙般
浜屻侀氲绠$悊绯荤粺
闅惧害绯绘暟:
浠g爜閲:400琛
瀹炵幇锷熻兘:阃氲褰曚俊鎭镄勫炲垹鏀规煡镎崭綔銆傞傚悎浜虹兢: C璇瑷镄勫埯瀛﹁咃纴闅惧害杈冨皬锛屼笉钖堥傚啓鍦ㄧ亩铡嗕笂銆傜患钖埚簲鐢ㄦ暟缁勚佹寚阍堬纴鍙浠ラ敾镣肩紪绋嬮昏緫镐濈淮锛岀Н绱浠g爜閲忋
娑夊强鎶链:鏁扮粍銆佹寚阍堛佺粨鏋勪綋銆佸嚱鏁般
涓夈佸仠杞︾$悊绯荤粺
闅惧害绯绘暟:
浠g爜閲:800琛
瀹炵幇锷熻兘:锅滆溅銆佹垒杞︺佺即璐广佺诲紑銆佽矾绾胯勫垝銆
阃傚悎浜虹兢:链塁璇瑷鍜岄摼琛ㄣ佹爤銆侀槦鍒楀熀纭銆
娑夊强鎶链:鎸囬拡銆佹暟缁勚侀摼琛ㄣ侀槦鍒椼佸箍搴︿紭鍏堟悳绱銆
锲涖佸熀鍗幂栌搴AI镄勫浘镀忚瘑鍒
闅惧害绯绘暟:
浠g爜閲:800琛
瀹炵幇锷熻兘:锅滆溅銆佹垒杞︺佺即璐广佺诲紑銆佽矾绾胯勫垝銆
阃傚悎浜虹兢:链塁璇瑷鍜岄摼琛ㄣ佹爤銆侀槦鍒楀熀纭銆
娑夊强鎶链:鎸囬拡銆佹暟缁勚侀摼琛ㄣ侀槦鍒椼佸箍搴︿紭鍏堟悳绱銆
浜斻佹櫤鑳绗iFi鎽勫儚澶
闅惧害绯绘暟
浠g爜閲:1500琛
璇瑷: C璇瑷
瀹炵幇锷熻兘:锲惧儚鏁版嵁閲囬泦銆丄PP鏄剧ず銆佽繙绋嬫带鍒堕傚悎浜虹兢:链塁璇瑷銆丩inux銆佺绣缁滃熀纭锛屽睘浜庣患钖堟ч”鐩锛岄傚悎链夋剰浠庝簨宓屽叆寮忓紑鍙戠殑钖屽︺
纭浠跺钩鍙:NanoPi Duo2
娑夊强鎶链: mjpg_stremer銆乯son銆乀CP銆乁DP銆丵T銆乪poll
鍏銆佹櫤鑳介煶绠
闅惧害绯绘暟:
浠g爜閲:3000琛
瀹炵幇锷熻兘:鐢卞祵鍏ュ纺绔銆佸悗鍙颁簯链嶅姟鍣ㄥ拰APP缁勬垚锛屽疄鐜颁简鍒囨瓕銆佹殏锅溿佺户缁銆侀煶閲忚皟鑺伞丄PP杩灭▼鎺у埗銆佽阔虫带鍒躲
阃傚悎浜虹兢:链塁/C++/Linux锘虹锛岀患钖堟ф瘆杈冨己锛屽彲浠
浣滀负椤圭洰鎻愬崌銆佹瘯璁俱佸氨涓氱瓑銆
纭浠跺钩鍙;mini2440
娑夊强鎶链: C/C++銆乴ibevnet銆乯son銆佽繘绋嬨乀CP銆丵T
涓冦丱penCV鏅鸿兘灏忚溅
闅惧害绯绘暟:
浠g爜閲:1000琛
瀹炵幇锷熻兘:杞﹁缔鎺у埗銆佸畾阃熷贰鑸銆佹祴璺濄佽溅阆撴娴嬩互鍙
杞﹂亾淇濇寔銆
阃傚悎浜虹兢:链塁璇瑷鍜屽崟鐗囨満寮鍙戝熀纭銆
纭浠跺钩鍙:51鍗旷墖链哄拰ARMCortexA寮鍙戝椾欢
娑夊强鎶链: C璇瑷銆51鍗旷墖链恒佸浘镀忓勭悊銆佷覆鍙i氢俊銆
鍏銆佽繙绋嬮氢俊杞浠
闅惧害绯绘暟: 浠g爜閲:3000琛
瀹炵幇锷熻兘:娉ㄥ唽銆佺橱褰曘佹坊锷犲ソ鍙嬨佽亰澶┿佸缓缇ゃ佹枃浠朵紶杈撱
阃傚悎浜虹兢:链塁++銆佺绣缁滃熀纭銆
骞冲彴:瀹㈡埛绔疻indows銆佹湇锷″櫒Linux銆
娑夊强鎶链: C++銆乴ibevent銆丵T銆佸氱嚎绋嬨丮ySQL銆佹枃浠
C. 什么是多线程编程
多线程编程技术是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
D. 关于C++多线程编程教学
在Windows NT和Windows 9x中,多线程的编程实现需要调用一系列的API函数,如CreateThread、ResumeThread等,比较麻烦而且容易出错。我们使用Inprise公司的新一代RAD开发工具C++Builder,可以方便地实现多线程的编程。与老牌RAD工具Visual Basic和Delphi比,C++Builer不仅功能非常强大,而且它的编程语言是C++,对于系统开发语言是C的Windows系列操作系统,它具有其它编程语言无可比拟的优势。利用C++Builder提供的TThread对象,多线程的编程变得非常简便易用。那么,如何实现呢?且待我慢慢道来,让你体会一下多线程的强大功能。
1. 创建多线程程序:
首先,先介绍一下实现多线程的具体步骤。在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子类的原码,如下:
#include
#pragma hdrstop
#include “Unit2.h”
#pragma package(smart_init)
//---------------------
// 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)
: TThread(CreateSuspended)
{
}
//--------------------
void __fastcall MyThread::Execute()
{
//---- Place thread code here ----
}
//---------------------
其中的Execute()函数就是我们要在线程中实现的任务的代码所在处。在原代码中包含Unit2.cpp,这个由我们创建的TMyThread对象就可以使用了。使用时,动态创建一个TMyThread 对象,在构造函数中使用Resume()方法,那么程序中就增加了一个新的我们自己定义的线程TMyThread,具体执行的代码就是Execute()方法重载的代码。要加载更多的线程,没关系,只要继续创建需要数量的TMyThread 对象就成。
E. C语言基础网络编程求助 如何实现多线程
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void*thread(void*);
int client[5],i;
main()
{
int serverSocket= socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in server_addr;
struct sockaddr_in clientAddr;
int addr_len = sizeof(clientAddr);
//线程
pthread_t id;
pthread_attr_t attr;
pthread_attr_init(&attr);////////////////////////////////////////////////
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
//创建地址
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family =AF_INET;
server_addr.sin_port = htons(5555);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//绑定
bind(serverSocket,(struct sockaddr *)&server_addr,sizeof(server_addr));
listen(serverSocket,5);
for(i=0;i<5;i++)
{
client[i] = accept(serverSocket,(struct sockaddr *)&clientAddr,(socklen_t*)&addr_len);
pthread_create(&id,&attr,thread,(void *)&client[i]);/////////////////////////////////
pthread_join(id,NULL);
}
close(serverSocket);/////////////////////////
return 0;
}
void* thread(void* argv)
{
char buffer[200];
int a=i;
int s_c = *((int*)argv);///////////////////
while(1)
{
int n = recv(s_c,buffer,sizeof(buffer),0);
if(n > 0)
printf("客户端发过来的 : %s\n",buffer);
else
return;
}
close(s_c);
}
F. 怎么用c语言编程 实现创建原语、撤销原语、阻塞原语和唤醒原语
下,应该差不多
一、如何建立线程
用到的头文件
(a)pthread.h
(b)semaphore.h
(c) stdio.h
(d)string.h
定义线程标识
pthread_t
创建线程
pthread_create
对应了一个函数作为线程的程序段
注意的问题
要保证进程不结束(在创建线程后加死循环)
在线程中加入While(1)语句,也就是死循环,保证进程不结束。
二、控制线程并发的函数
sem_t:信号量的类型
sem_init:初始化信号量
sem_wait:相当于P操作
sem_post:相当于V操作
三、实现原形系统
父亲、母亲、儿子和女儿的题目:
桌上有一只盘子,每次只能放入一只水果。爸爸专放苹果,妈妈专放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果。分别用P,V操作和管程实现
每个对应一个线程
pthread_t father; father进程
pthread_t mother; mother进程
pthread_t son; son进程
pthread_t daughter; daughter进程
盘子可以用一个变量表示
sem_t empty;
各线程不是只做一次,可以是无限或有限次循环
用While(1)控制各线程无限次循环
输出每次是那个线程执行的信息
printf("%s\n",(char *)arg);通过参数arg输出对应线程执行信息
编译方法
gcc hex.c -lpthread
生成默认的可执行文件a.out
输入./a.out命令运行
查看结果:程序连续运行显示出
father input an apple.
daughter get an apple.
mother input an orange.
son get an orange.
mother input an orange.
son get an orange.
………………..
四、程序源代码
#include <stdio.h>
#include<string.h>
#include <semaphore.h>
#include <pthread.h>
sem_t empty; //定义信号量
sem_t applefull;
sem_t orangefull;
void *procf(void *arg) //father线程
{
while(1){
sem_wait(&empty); //P操作
printf("%s\n",(char *)arg);
sem_post(&applefull); //V操作
sleep(7);
}
}
void *procm(void *arg) //mother线程
{
while(1){
sem_wait(&empty);
printf("%s\n",(char *)arg);
sem_post(&orangefull);
sleep(3);
}
}
void *procs(void *arg) //son线程
{
while(1){
sem_wait(&orangefull);
printf("%s\n",(char *)arg);
sem_post(&empty);
sleep(2);
}
}
void *procd(void *arg) //daughter线程
{
while(1){
sem_wait(&applefull);
printf("%s\n",(char *)arg);
sem_post(&empty);
sleep(5);
}
}
main()
{
pthread_t father; //定义线程
pthread_t mother;
pthread_t son;
pthread_t daughter;
sem_init(&empty, 0, 1); //信号量初始化
sem_init(&applefull, 0, 0);
sem_init(&orangefull, 0, 0);
pthread_create(&father,NULL,procf,"father input an apple."); //创建线程
pthread_create(&mother,NULL,procm,"mother input an orange.");
pthread_create(&daughter,NULL,procd,"daughter get an apple.");
pthread_create(&son,NULL,procs,"son get an orange.");
while(1){} //循环等待
}
另外,站长团上有产品团购,便宜有保证