当前位置:首页 » 编程软件 » c多线程编程pdf

c多线程编程pdf

发布时间: 2023-08-19 18:23:13

1. 什么是多线程编程

多线程编程技术是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

2. 求C++程序设计语言(特别版)中文版 PDF(非扫描版)!!!!!!!!!!!我会追加分的!

你的扫描版怎么了?不清晰吗?我下得应该是扫描的但是还不错啊

3. c++ 多线程编程常用的几个函数

1、C++多线程也可以使用UNIX C的库函数,pthread_mutex_t,pthread_create,pthread_cond_t,pthread_detach,pthread_mutex_lock/unlock,等等。在使用多线程的时候,你需要先创建线程,使用pthread_create,你可以使主线程等待子线程使用pthread_join,也可以使线程分离,使用pthread_detach。线程使用中最大的问题就是同步问题,一般使用生产着消费者模型进行处理,使用条件变量pthread_cond_t,pthread_mutex,pthread_cond_wait来实现。
2、例程:
//创建5个线程
#include <pthread.h>
#include <stdlib.h>

void* work_thread(void* arg)
{

//线程执行体
return 0;
}
int main(int argc,char* argv[])
{
int nthread = 5;//创建线程的个数
pthread_t tid;//声明一个线程ID的变量;
for(int i=0;i<nthread;i++)
{
pthread_create(&tid,NULL,work_thread,NULL);
}
sleep(60);//睡眠一分钟,你可以看下线程的运行情况,不然主进程会很快节结束了。
}
pthread_create(&tid,NULL,work_thread,NULL);//创建线程的函数,第一个参数返回线程的ID;第二个参数是线程的属性,一般都置为NULL;第三个参数是线程函数,线程在启动以后,会自动执行这个函数;第四个参数是线程函数的参数,如果有需要传递给线程函数的参数,可以放在这个位置,可以是基础类型,如果你有不止一个参数想传进线程函数,可以做一个结构体,然后传入。

4. 寻c语言学习资料

谭浩强C语言教程全书 Word版
http://bbs.topsage.com/dispbbs_121_171227_1.html
c 程序设计习题参考(谭浩强二.三版)
http://www.khdaw.com/bbs/thread-80-1-1.html
http://www.khdaw.com/bbs/thread-47-1-4.html
谭浩强教材:
http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=4363060
谭浩强习题答案:
http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=2302699
C语言趣味程序百例精解
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=158110
吉林大学C语言视频教程 全51集 CSF格式
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=177517
C语言基础视频教程 全14讲 完整上架
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=181035
C语言程序设计视频教程 曾怡教授讲解 全28讲完整版下载
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=181575
数据结构视频教程 清华大学严蔚敏主讲 全48讲 完整版 ASF格式
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=165468
数据结构C语言版视频教程 全52讲完整版
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=156467

孙鑫C++视频教程 rmvb格式 全20CD完整版
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=156290
C++视频教程 边用边学Visual C++ 6 (ASF格式)
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=177500
中山大学蔡培兴 C++语言视频教程 全51讲 精品推荐
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=158073
C++程序设计视频教程 东南大学何洁月主讲 全80讲(上) 48讲
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=181543
C++程序设计视频教程 东南大学何洁月主讲 全80讲(下) 32讲
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=181546

钱能 c++程序设计教程 第二版 高清PDF版
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=166018
Essential C++ 中文版+英文版 侯捷译
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=167578
编程点金之Visual C++(电子教程) iso
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=181036
C++程序调试实用手册 PDF版下载
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=181037
C++面向对象多线程编程 PDF版下载
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=181038
C++高级编程参考手册
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=145562
C++ Primer 第三版
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=145858
C++ Primer 第四版 中文版高清晰
http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=177763

5. 关于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 对象就成。

6. 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
);

7. 用C语言在windows或者Linux上面,编写一个多线程程序

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
int *pt=(int*)lpParam;

printf("I am tread %d\r\n",*pt);
}
int main()
{
const int Count=4;
int datas[Count];
DWORD dwThreadId[Count];
HANDLE hThread[Count];
int i;

for(i=0;i<Count;i++)
{
datas[i]=i+1;
hThread[i]=CreateThread(NULL,0,ThreadProc,&datas[i],0,&dwThreadId[i]);
}
WaitForMultipleObjects(Count,hThread,TRUE,INFINITE);
for(i=0;i<Count;i++)
{
CloseHandle(hThread[i]);
}
system("PAUSE");
return EXIT_SUCCESS;
}

8. 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);
}

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

这是一个多线程例子,里面只有两个线程,是生产者/消费者模式,已编译通过,注释很详细,x0dx0a如下:x0dx0ax0dx0a/* 以生产者和消费者模型问题来阐述Linux线程的控制和通信你 x0dx0a 生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。x0dx0a 缓冲区有N个,是一个环形的缓冲池。x0dx0a */x0dx0a#include x0dx0a#include x0dx0ax0dx0a#define BUFFER_SIZE 16x0dx0ax0dx0astruct prodconsx0dx0a{x0dx0a int buffer[BUFFER_SIZE];/*实际存放数据的数组*/x0dx0a pthread_mutex_t lock;/*互斥体lock,用于对缓冲区的互斥操作*/x0dx0a int readpos,writepos; /*读写指针*/x0dx0a pthread_cond_t notempty;/*缓冲区非空的条件变量*/x0dx0a pthread_cond_t notfull;/*缓冲区未满 的条件变量*/x0dx0a};x0dx0ax0dx0a/*初始化缓冲区*/x0dx0avoid pthread_init( struct prodcons *p)x0dx0a{x0dx0a pthread_mutex_init(&p->lock,NULL);x0dx0a pthread_cond_init(&p->notempty,NULL);x0dx0a pthread_cond_init(&p->notfull,NULL);x0dx0a p->readpos = 0;x0dx0a p->writepos = 0;x0dx0a}x0dx0ax0dx0a/*将产品放入缓冲区,这里是存入一个整数*/x0dx0avoid put(struct prodcons *p,int data)x0dx0a{x0dx0a pthread_mutex_lock(&p->lock);x0dx0a /*等待缓冲区未满*/x0dx0a if((p->writepos +1)%BUFFER_SIZE ==p->readpos)x0dx0a {x0dx0a pthread_cond_wait(&p->notfull,&p->lock);x0dx0a }x0dx0a p->buffer[p->writepos] =data;x0dx0a p->writepos++;x0dx0a if(p->writepos >= BUFFER_SIZE)x0dx0a p->writepos = 0;x0dx0a pthread_cond_signal(&p->notempty);x0dx0a pthread_mutex_unlock(&p->lock);x0dx0a}x0dx0a/*从缓冲区取出整数*/x0dx0aint get(struct prodcons *p)x0dx0a{x0dx0a int data;x0dx0a pthread_mutex_lock(&p->lock);x0dx0a /*等待缓冲区非空*/x0dx0a if(p->writepos == p->readpos)x0dx0a {x0dx0a pthread_cond_wait(&p->notempty ,&p->lock);//非空就设置条件变量notemptyx0dx0a }x0dx0a /*读书据,移动读指针*/x0dx0a data = p->buffer[p->readpos];x0dx0a p->readpos++;x0dx0a if(p->readpos == BUFFER_SIZE)x0dx0a p->readpos = 0;x0dx0a /*设置缓冲区未满的条件变量*/x0dx0a pthread_cond_signal(&p->notfull);x0dx0a pthread_mutex_unlock(&p->lock);x0dx0a return data;x0dx0a}x0dx0a /*测试:生产站线程将1 到1000的整数送入缓冲区,消费者线程从缓冲区中获取整数,两者都打印信息*/x0dx0a#define OVER (-1)x0dx0astruct prodcons buffer;x0dx0avoid *procer(void *data)x0dx0a{x0dx0a int n;x0dx0a for( n=0;n<1000;n++)x0dx0a {x0dx0a printf("%d ------>\n",n);x0dx0a put(&buffer,n);x0dx0a }x0dx0a put(&buffer,OVER);x0dx0a return NULL;x0dx0a}x0dx0avoid *consumer(void *data)x0dx0a{x0dx0a int d;x0dx0a while(1)x0dx0a {x0dx0a d = get(&buffer);x0dx0a if(d == OVER)x0dx0a break;x0dx0a elsex0dx0a printf("----->%d\n",d);x0dx0a }x0dx0a return NULL;x0dx0a}x0dx0aint main()x0dx0a{x0dx0a pthread_t th_p,th_c;x0dx0a void *retval;x0dx0a pthread_init(&buffer);x0dx0a pthread_create(&th_p,NULL,procer,0);x0dx0a pthread_create(&th_c,NULL,consumer,0);x0dx0a /*等待两个线程结束*/x0dx0a pthread_join(th_p, &retval);x0dx0a pthread_join(th_c,&retval);x0dx0a return 0;x0dx0a}

热点内容
什么是身份证密码 发布:2025-02-04 05:43:41 浏览:784
云服务器江苏 发布:2025-02-04 05:38:46 浏览:236
算法及vb 发布:2025-02-04 05:33:37 浏览:99
安卓手机怎么自检电池 发布:2025-02-04 05:31:31 浏览:409
两种存储 发布:2025-02-04 05:26:43 浏览:203
手机php源码 发布:2025-02-04 05:08:22 浏览:548
全战帝国与拿战哪个配置高 发布:2025-02-04 04:59:39 浏览:753
海控联盟怎么下载安卓版 发布:2025-02-04 04:55:52 浏览:767
妖荡三界安卓叫什么 发布:2025-02-04 04:54:24 浏览:835
数据库表的备份 发布:2025-02-04 04:53:50 浏览:564