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;
}
相關文章
- 多執行緒,到底該設定多少個執行緒?執行緒
- Linux中最多有多少程式?一個程式最多有多少執行緒?Linux執行緒
- 被問懵了:一個程式最多可以建立多少個執行緒?執行緒
- JVM原始碼分析之一個Java程式究竟能建立多少執行緒JVM原始碼Java執行緒
- 啟動一個最簡單的Java main程式時,有多少個執行緒被建立JavaAI執行緒
- 遊戲伺服器啟動多少個執行緒合適遊戲伺服器執行緒
- 如何查詢一個程式下面的執行緒數(程式和執行緒區別)執行緒
- 加入一個執行緒執行緒
- JVM程式用一個主執行緒來執行main()方法JVM執行緒AI
- 畫江湖之 PHP 多執行緒開發 【建立一個新的執行緒】PHP執行緒
- 畫江湖之 PHP 多執行緒開發 [建立一個新的執行緒]PHP執行緒
- 什麼?一個核同時執行兩個執行緒?執行緒
- 面試問我,建立多少個執行緒合適?我該怎麼說面試執行緒
- 利用多執行緒寫一個賣票程式執行緒
- windows核心程式設計--執行緒池Windows程式設計執行緒
- Windows程式設計系列:遠執行緒注入Windows程式設計執行緒
- 最全面的阿里多執行緒面試題,你能回答幾個?阿里執行緒面試題
- Swoole 啟動一個服務,開啟了哪些程式和執行緒?執行緒
- 程式與執行緒的一個簡單解釋執行緒
- 分享一個c執行緒池實現程式碼執行緒
- Win32執行緒——等待另一個執行緒結束Win32執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 100行Java程式碼構建一個執行緒池Java執行緒
- 怎樣停止一個正在執行的執行緒執行緒
- 程式執行緒篇——程式執行緒基礎執行緒
- 哪位大哥能教我寫個執行緒併發訪問的類嗎?執行緒
- 三個執行緒迴圈列印123-多執行緒執行緒
- 雲原生執行時的下一個五年
- 掃描整個網段的多執行緒程式(轉)執行緒
- Java多執行緒——獲取多個執行緒任務執行完的時間Java執行緒
- linux 實時檢視一個 python 程式有幾個執行緒LinuxPython執行緒
- disruptor如何實現每CPU執行一個執行緒?執行緒
- 程式-程式-執行緒執行緒
- Java執行緒的5個使用技巧Java執行緒
- 15個Java多執行緒面試題Java執行緒面試題
- 50個Java多執行緒面試題Java執行緒面試題
- C#多執行緒學習(二) 如何操縱一個執行緒C#執行緒
- C# 多執行緒學習(2) :如何操縱一個執行緒C#執行緒