vc++一个进程负责写入共享区,然后多个进程读取,会有什么异常吗?

作者&投稿:芮澜 (若有异议请与网页底部的电邮联系)
进程共享内存多个程序写, 一个程序读取会冲突吗~

加上互斥锁,锁上了就不能访问,这样需要读但是临界区被锁的时候让进程等着就行了

1、多进程不一定优于多线程
2、共享内存没有问题
3、Linux上的话,进程间共享数据可以用D-Bus,更可靠而且简单。D-Bus也是广播的。
如果要考虑高可靠性的话,那么采集程序可以单独一个进程,然后通过MOM,如ActiveMQ之类的用持久方式传送数据,可以广播也可以点对点,也支持分布式。监听程序两个,一个显示一个保存至数据库。这样的话只要考虑采集程序的高可靠性就可以了,因为如果采用持久方式发送数据的话,对方没有接收到数据的时候是会保存下来的。

WinSock(Windows Sockets)是处理网络通信的Windows API。许多函数与在BSD中使用的Berkely套接字函数是相同的。套接字,简单的说就是通信双方的一种约定,用套接字中的相关函数来完成通信过程。

应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。

Socket可以看成在两个程序进行通讯连接中的一个端点(endpoint),一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。一般一个server服务器对应很多客户端client连接,服务器必须维护一张客户连接列表,每增加一个客户端连接服务器端都要新建一个套接字负责与新增客户端进行对话通信。

传输套接字主要有两类:流式套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)。流类型的套接字是为需要可靠连接的应用程序设计的。这些程序通常使用连续的数据流。用于这种类型套接字的协议是TCP,适合FTP这类实现。流套接字是最常用的,一些众所周知的协议如HTTP、TCP、SMTP、POP3等都是基于面向流的协议。

数据报套接字使用UDP做为下层协议,是无连接的,有一个最大缓冲区大小(数据包大小的最大值)。它是为那些需要发送小数据包,并且对可靠性要求不高的应用程序设计的。与流式套接字不同,数据报套接字并不保证数据会到达终端,也不保证它是以正确的顺序到来的。数据报套接字的传输效率相当高,它经常用于音频或视频应用程序。对这些程序来说,速度比可靠性更加重要。

一个连接由(server_ip, server_port)和(client_ip, client_port)唯一确定。你可以调用 getsockname() 函数获取与某个套接字关联的本地地址,调用 getpeername() 函数获取与某个套接字关联的目的地址。

套接字有阻塞(锁定)和非阻塞(非锁定)两种模式。非阻塞和阻塞描述的是 WinSock API 调用行为特性。

在一个阻塞套接字上调用任何 WinSock API 函数(accept()/recv()/send()),都会耗费或长或短的时间“等待”返回,这会阻塞调用线程。直到有点数据可读或可写时,这种调用才返回。

阻塞模式的优点是符合时序,容易入手。缺点也是显而易见的,假设这样一种情景,一个线程中要处理多个客户(套接字A、B),我们在套接字A、B上顺序调用recv企图依次接收数据。若客户A始终不发数据,则recv(A)函数将可能永远无法返回,在这期间我们错失了客户B发送来的数据。

大多数WinSock应用都遵循“生产者-消费者”模型,应用程序需要读取(或写入)指定数量的字节,然后再对读取的数据执行一些计算。在应用程序中,可以为每个套接字都创建一个负责读取网络数据的读线程(ReadThread),以及一个负责对数据执行计算的数据处理线程(ProcessThread)。尽管这会增大一些开销,但的确是一种可行的方案。缺点便是扩展性极差,而且无法应对大规模的通信情况。

将一个套接字置为非阻塞模式之后,WinSock API 调用会立即返回。大多数情况下,这些调用都会“失败”(SOCKET_ERROR),并返回一个WSAEWOULDBLOCK错误。它意味着请求的操作在调用期间没有时间完成。举个例子来说,假如在系统的输入缓冲区中,尚不存在“待决”的数据,那么recv()调用就会返回WSAEWOULDBLOCK错误。通常,我们需要重复调用同一个函数(轮询),直至获得一个成功返回代码。

假如需要编写更多的代码,以便在每个 Winsock调用中,对收到一个WSAEWOULDBLOCK错误的可能性加以应付,那么非阻塞套接字便显得有些难于操作。在这些情况下,可考虑使用“套接字I/O模型”,它管理I/O完成通知,帮助应用程序判断套接字何时可供读写。

套接字模式讨论的是套接字函数的调用特性,而I/O模型讨论的是调用背后的行为特性。

当CPU执行代码(当前活动线程)时遇上一个I/O请求(例如调用ReadFile()/WriteFile()或recv()/send())时,系统产生一个中断,当前活动线程阻塞在此,让CPU去完成这个I/O请求,等到完成后,系统再次产生一个中断让原先的程序继续运行。也就说通过中断保持这两者间的同步,可以将中断理解为硬件化的信号量。

这就是所谓的同步I/O,一个线程中只可能同时处理一个I/O请求。因为一个I/O操作是非常耗时的,所以代码挂起后等待I/O完成的这段时间内,这个线程浪费了很多个指令周期。如果要同时反复读写大文件,则同步I/O的效率是很低的。

当然,可以考虑使用多线程来处理。例如在设计服务器时可以使用多线程来处理客户请求,每有一个客户连接请求,就创建一个新线程,专门处理它的通信请求。对于小型服务器来说,这不是问题。对于同时处理成千上万个请求的大型服务器而言,使用多线程是无效的,因为系统能够支持的线程数量毕竟是有限制的。另外一种解决方案就是使用共享负载的线程池,这涉及到异步I/O。




C语言中的fork和pipe的问题
fork ---> fork ---> fork 加入进程A fork出了进程B,然后进程B又fork出了进程C,进程C又fork出了进程D pipe是管道,只有一个入口,一个出口。可以把入口和出口分别放到父子进程中。父进程负责读,子进程负责写。或者子进程读,父进程写。你的例子里,在进程A里创建管道PipeA,然后fork出进程B...

进程是不是就是一条程序中的语句?如果不是那是什么?
进程不是一个程序的语句! 进程一个管理运行一个程序所需资源的容器,它包括你的程序代码、线程、地址空间、打开的文件等等资源。

c怎么修改进程名字
在linux下,使用C语言用shell启动进程,进程的名字会以可执行文件的名字来进行修改。如果一个程序内有多个进程,这样每个进程的名字都是一样的,如果想修改调试某条特定的进程是无法做到的,这样会给程序管理带来不便。所以根据进程负责的不同功能需要给进程进行重新命名,这样不只方便程序的管理,在开发的时...

进程c:\\windows\\explorer.exe是个什么程序啊?
该病毒会在受害者机器上建立SMTP服务。该病毒允许攻击者访问你的计算机、窃取密码和个人数据。该进程的安全等级是建议删除。凡是Windows系列的操作系统,运行时都会启动一个名为Explorer.exe的进程。这个进程主要负责显示系统桌面上的图标以及任务栏,它在不同的系统中有不同的妙用,我们一起来看一看。Windows...

电脑有一个taskhost.exe的进程,大量占用CPU,不定期运行,杀毒软件查不...
taskhost.exe实际上是Windows 7系统自带的一个进程,专门负责管理系统的任务调度,通常被称为计划任务程序。它允许用户设置定时操作,使得操作系统在预设的时间执行相关任务,为用户的便利提供了支持。这个进程位于C:\\Windows\\System32目录下,是系统进程的一部分,属于正常操作。若发现taskhost.exe的位置不在...

谁能帮我解释一下任务管理器中各个进程的意思?
进程名称: Session Manager Subsystem 描述: 该进程为会话管理子系统用以初始化系统变量,MS-DOS驱动名称类似LPT1以及COM,调用Win32壳子系统和运行在Windows登陆过程。 简介:这是一个会话管理子系统,负责启动用户会话。这个进程是通过系统进程初始化的并且对许多活动的,包括已经正在运行的Winlogon,Win32(Csrss.exe)线程...

win10进程wsappx是什么进程?
wsappx 进程Win10系统的一部分,是可以停止的。appmodle是win10的应用商店里的管理程序,由State Repository Service服务创建,运行路径是C:\\Windows\\system32\\svchost.exe -k appmodel。描述为为应用程序模型提供所需的基础结构支持。wsappx 进程Win10系统的一部分,是Win Store和微软通用应用程序平台(UWP...

如何获取某个进程的主窗口以及创建进程的程序名
DWORD pid = \/\/ 已知某个进程的ID CMainWindowIterator itw(pid);for (HWND hwnd = itw.First(); hwnd; hwnd=itw.Next()) { \/\/ do something } 就这么简单,CMainWindowIterator派生于一个更通用的类:CWindowIterator,CWindowIterator负责将::EnumWindows函数打包以隐藏回调细节。它有一个虚拟...

svchost.exe是什么进程?
svchost.exe是Windows操作系统中的一个关键进程,由微软官方定义为运行DLL中服务的通用主机程序。这个程序对于系统的正常运作至关重要,且不允许被随意结束。不同版本的Windows系统中,svchost进程的数量有所差异。例如,Windows 2000有2个,Windows XP则至少4个,Windows 2003 Server则更多。这些进程负责提供...

使用C语言编程实现:父进程创建二个子进程,三个进程各自打印出其进程...
include <sys\/types.h> #include <unistd.h> int main(void) { int i=2; pid_t pid; while(i--){ if((pid=fork())<0){ err_sys(",

西吉县19478091237: linux 共享内存 可不可以不加锁呢? 系统有两个进程,一个负责写入,一个负责读取 -
字都艾太: Linux共享内存可以不用加锁,不过需要一种机制来标记共享内存的读写状态;也就是说要让两个进程知道:1)负责写入的进程,必须知道当前共享内存是否可以写入,上一次的写入内容是否有被负责读取的进程读走;2)负责读取的进程,必须知道当前共享内存是否需要读取,防止重复读取.一般的这种标记机制是通过以下方式来简单实现:1)通过读写锁来控制;2)共享内存上设置一个地方,专门存放当前共享内存的读写状态;

西吉县19478091237: C++建立两个内存缓冲区 通过多线程共享内存进行读写 -
字都艾太: 共享内存:实现进程间通信的一种方式.希望访问该内存块的其他进程必须请求对它的访问,或由创建它的进程授予访问内存块的权限.共享内存被映射到使用它的每个进程的地址空间.当一个进程写共享内存,所有进程都立即知道写入的内容...

西吉县19478091237: VC++ 关于共享内存进程间通信的问题 -
字都艾太: 这是因为VC6默认是ANSI编码,而VC2008默认是UNICODE编码,所有字符串都是宽字节的,一个简单解决办法就是把你的VC2008配置改下,使用多字节编码就行了

西吉县19478091237: C++中如何控制多线程对共享资源的访问,进程死锁产生的原因是什么?
字都艾太: 1.创建事件对象或互斥对象 (创建一个全局标记(无论什么都可以,对象,变量),看是否有其他线程使用,注意,使用后必须重置标记 ) 例子: WaitSignal();等待资源 SetSignal();把资源设置成正在使用 ...代码; ReleaseSighal();重置资源,这样其他资源都可以使用 2.各线程含有一部分资源,但仍需要(等待)其他线程的资源. 比如:有两个资源,汽车和车钥匙 A有车,B有车钥匙 但他们都不把拥有的资源给对方,这样他们都不能开车,即死锁.

西吉县19478091237: VC++考试复习题 大家帮帮忙 -
字都艾太: 说法一:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上...

西吉县19478091237: vc 如何解决多道程序共享数据的问题
字都艾太: 请问阁下的意思是多个进程共享一个或者多个数据吧,这种情况下必须采用线程同步机制, 下面,笔者罗列集中方式,让您看看吧. 1,关键代码区,亦称作临界区,一般应用于同一进程下不同线程的某一共享数据, 下面采用伪代码 ...

西吉县19478091237: Microsoft Visual C++ Runtime Library Program:C\Winwows\system32\taskhost.exe R6016 - not enough ... -
字都艾太: 程序运行的空间不足了!不想用的话就到任务管理器中把它关上.(选中它,再点“结束进程”) 补充:taskhost.exe进程是Windows7自带的一个进程,是负责Windows7运行计划的,简单的来说也可以称作计划任务程序,这个程序也是...

西吉县19478091237: 用C++解决进程通讯问题 -
字都艾太: 我用管道和共享内存给你写了一个#include #include #include #include #include#include#include char *Create_mmap(char* mmapname,int memsize) { int fd_in; fd_in=open(mmapname,O_CREAT|O_RDWR,00644 ); lseek(fd_in,memsize,SEEK_...

西吉县19478091237: c++多线程问题
字都艾太:当多个线程访问一个独占性共享资源时,可以使用“临界区”对象.任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网