windows 下一个进程能开多少个线程

进程里面创建线程数收到总线的限制,32位最多只能访问4G内存,其中2G为用户态使用;而每个线程都有自己的栈大小;测试发现使用createthread创建线程;当栈设置为1M时,只能开大约1426个线程;当设置为512k时,可以开2244个线程,设置为256k时,可以开3122个线程,所以在我们做sock通信服务器时,需要注意,如果一个客户端 connect进来,就用一个线程对它进程处理的话,服务端会收到线程数的限制;测试代码如下:

server

// server.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <winsock2.h>
#include <stdio.h>
#include <list>
using namespace std;

#define STACK_SIZE 256*1024
#define MAX_COUNT  10000

bool stop=false;

DWORD WINAPI StartThreadFunc(PVOID pvParam)
{
   DWORD dwTid;
   printf("%-3d:0x%x\n",pvParam,&dwTid);
   while (!stop)
   {
	   Sleep(5000);
	  // printf("sock run\n");
   }
   return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{

	// Initialize Winsock.
	if (argc<=2)
	{
		printf("param error\n");
		return 1;
	}

	const char *ip=argv[1];
	int port =atoi(argv[2]);

	WSADATA wsaData;
	int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
	if (iResult != NO_ERROR) {
		printf("Error at WSAStartup()\n");
		return 1;
	}

	//----------------------
	// Create a SOCKET for listening for
	// incoming connection requests.
	SOCKET ListenSocket;
	ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (ListenSocket == INVALID_SOCKET) {
		printf("Error at socket(): %ld\n", WSAGetLastError());
		WSACleanup();
		return 1;
	}

	//----------------------
	// The sockaddr_in structure specifies the address family,
	// IP address, and port for the socket that is being bound.
	sockaddr_in service;
	service.sin_family = AF_INET;
	service.sin_addr.s_addr = inet_addr(ip);
	service.sin_port = htons(port);

	if (bind( ListenSocket,
		(SOCKADDR*) &service,
		sizeof(service)) == SOCKET_ERROR) {
			printf("bind() failed.\n");
			closesocket(ListenSocket);
			WSACleanup();
			return 1;
	}

	//----------------------
	// Listen for incoming connection requests.
	// on the created socket
	if (listen( ListenSocket, 1 ) == SOCKET_ERROR) {
		printf("Error listening on socket.\n");
		closesocket(ListenSocket);
		WSACleanup();
		return 1;
	}

	//----------------------
	// Create a SOCKET for accepting incoming requests.
	//SOCKET AcceptSocket;
	printf("Waiting for client to connect...\n");

	int clientNum=0;
	HANDLE m_hCommun[MAX_COUNT]={NULL};
	SOCKET sockNum[MAX_COUNT]={-1};

	while (clientNum<MAX_COUNT)
	{
		// Accept the connection.
		sockNum[clientNum] = accept( ListenSocket, NULL, NULL );
		if (sockNum[clientNum]  == INVALID_SOCKET) {
			printf("accept failed: %d,clientNum=%d\n", WSAGetLastError(),clientNum);
			closesocket(ListenSocket);
			WSACleanup();
			return 1;
		} else
		{

			m_hCommun[clientNum] = CreateThread(NULL, STACK_SIZE, (LPTHREAD_START_ROUTINE)StartThreadFunc, (PVOID)clientNum, STACK_SIZE_PARAM_IS_A_RESERVATION, NULL);
			if (m_hCommun[clientNum]!=NULL)
			{
				printf("Client connected.clientNum=%d\n",clientNum);
			}
			clientNum=clientNum+1;
		}

	}
	//----------------------
	stop=true;

	for (int i=0;i<MAX_COUNT;i++)
	{
		if (sockNum[i]!=-1)
		{
			closesocket(sockNum[i]);
			sockNum[i]=-1;
		}

		if (m_hCommun[i]!=NULL)
		{
			CloseHandle(m_hCommun[i]);
			m_hCommun[i]=NULL;
		}
	}

	// No longer need server socket
	closesocket(ListenSocket);

	WSACleanup();
	printf("server exit\n");
	getchar();
	return 0;
}

client

// client.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include "winsock2.h"

#define MAX_COUNT  10000

int _tmain(int argc, _TCHAR* argv[])
{
	if (argc<=2)
	{
		printf("param error\n");
		return 1;
	}

	const char *ip=argv[1];
	int port =atoi(argv[2]);

	// Initialize Winsock
	WSADATA wsaData;
	int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
	if (iResult != NO_ERROR)
	{
		printf("Error at WSAStartup()\n");
	}

	SOCKET ConnectSocket[MAX_COUNT]={-1};

    for (int i=0;i<MAX_COUNT;i++)
    {
		// Create a SOCKET for connecting to server

		ConnectSocket[i] = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
		if (ConnectSocket[i] == INVALID_SOCKET) {
			printf("Error at socket(): %ld\n", WSAGetLastError());
			WSACleanup();
			return 1;
		}

		//----------------------
		// The sockaddr_in structure specifies the address family,
		// IP address, and port of the server to be connected to.
		sockaddr_in clientService;
		clientService.sin_family = AF_INET;
		clientService.sin_addr.s_addr = inet_addr(ip);
		clientService.sin_port = htons(port);

		//----------------------
		// Connect to server.
		if ( connect( ConnectSocket[i], (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
			printf( "Failed to connect.\n" );
			WSACleanup();
			return 1;
		}

		printf("============sock connect succ=%d\n",i);

		Sleep(100);
    }

	for (int i=0;i<MAX_COUNT;i++)
	{
		if (ConnectSocket[i]!=-1)
		{
			closesocket(ConnectSocket[i]);
			ConnectSocket[i]=-1;
		}
	}

	printf("exit to server.\n");
	getchar();
	WSACleanup();
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-09 05:27:28

windows 下一个进程能开多少个线程的相关文章

Linux下一个进程可以开多少线程

这个问题,整理了一下网上的资料,结果如下: 一.ulimit -n可以查看一个进程最多可以打开多少文件描述符数: 二.一个进程最多可以产生多少线程,可用如下的方法: 32位linux系统最大内存地址4G,0-3GB的给用户进程(User Space)使用,3-4GB给内核使用 stack size (kbytes,-s)10240表示线程堆栈大小,3G/10M=最大线程数, 但实际会比这个数小一点,因为程序本身占内存,还有些管理线程, 可以使用ulimit -s来设置stack size,设置的

windows 一个进程可以允许最大的线程数

默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小. 你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程. 如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程. 即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制. 比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用

Windows下的进程间通讯及数据共享

Windows 下的进程间通讯及数据共享 Windows 下有很多方法实现进程间通讯,比如用 socket,管道(Pipe),信箱(Mailslot),等等.但最基本最直接的还是使用内存共享.其他方法最终还是会绕道这里. 可想而知,如果物理内存只有一份,让这份内存在不同的进程中,映射到各自的虚拟地址空间上,每个进程都可以读取同一份数据,是一种最高效的数据交换方法.下面我们就讨论如何实现它. 共享内存在 Windows 中是用 FileMapping 实现的.我们可以用 CreateFileMap

Windows下tomcat进程监控批处理程序

在Windows下tomcat进程监控批处理程序脚本如下: @echo off ::tomcat安装目录 set _tomcatDir=E:\myFiles\apache-tomcat-8.5.31 set _curlDir=E:\myFiles\apache-tomcat-8.5.31\curl set "httpcode=" ::访问tomcat cd /d %_curlDir% for /f "delims=" %%r in ('CURL.EXE -m 60

转:Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。

原文来自于:http://www.ituring.com.cn/article/128439 Windows下的PHP开发环境搭建——PHP线程安全与非线程安全.Apache版本选择,及详解五种运行模式. 今天为在Windows下建立PHP开发环境,在考虑下载何种PHP版本时,遭遇一些让我困惑的情况,为了解决这些困惑,不出意料地牵扯出更多让我困惑的问题. 为了将这些困惑一网打尽,我花了一下午加一晚上的时间查阅了大量资料,并做了一番实验后,终于把这些困惑全都搞得清清楚楚了. 说实话,之所以花了这么

[转]Windows 下的进程间通讯及数据共享

http://blog.codingnow.com/2005/10/interprocess_communications.html Windows 下有很多方法实现进程间通讯,比如用 socket,管道(Pipe),信箱(Mailslot),等等.但最基本最直接的还是使用内存共享.其他方法最终还是会绕道这里. 可想而知,如果物理内存只有一份,让这份内存在不同的进程中,映射到各自的虚拟地址空间上,每个进程都可以读取同一份数据,是一种最高效的数据交换方法.下面我们就讨论如何实现它. 共享内存在 W

Windows下一个curl使用

一.简介 在上一篇中我们涉及到了一个在Ubuntu下使用的curl命令,而且使用这个命令来模拟server的功能来向谷歌的C2DMserver发送数据. 以下简单的来说下在Windows下相同的使用curl命令的方式. 二.详细实现 Windows下默认没有curl命令,须要安装后才干使用. 1.      到这里下载http://curl.haxx.se/download/文件curl-7.17.1-win32-ssl.zip,假设不须要使用ssl的话,能够直接下载curl-7.17.1-wi

Windows下一个ROracle安装与使用

ROracle一个简短的引论: ROracle这是R连接到接入Oracle数据库DBI(Oracledatabase interface)介面.这是基于OCI一个DBI兼容Oracle司机. 具体见说明书:http://cran.r-project.org/web/packages/ROracle/ROracle.pdf 在Linux下安装ROracle比較简单.仅仅须要用install.packages("ROracle")就可以,在windows下要通过源代码安装. 安装源文件下载

当有多于64合乎逻辑的cpu时刻,Windows 下一个Oracle db 实例启动(startup)什么时候会hang(待定)

Bug 9772171 - Database startup hangs on Windows when machine has more than 64 cores [ID 9772171.8] 该文章已经说明:在11.2.0.2 已经fix(解决)该bug. 而如今11gR2版本号已经推出了11.2.0.4.而且11.2.0.4是终于的11gR2版本号. 所以我们推荐安装11.2.0.4 外加最新的psu 最新的psu能够 查询这个文章获得:Oracle Database, Networki