我将创建一个网络系统,可以处理7000+ tcp套接字客户端,输入速度为5KB/s(客户端发送).我调查了这个问题:链接>>.他们说"创建1024个线程来处理1024个客户端".我知道有一个名为"select()"的方法,我认为我无法打开7000多个线程来处理7000多个客户端,因为我的处理器(或服务器)只有8CPU,这意味着7000多个线程是一个很大的错误.现在我想我将创建~1000个线程,我将处理这个线程中的每个7个套接字组.但现在问题是:如果我有相同的应用程序,但我有2CPU处理器,我无法获得1000个线程的最大性能,我应该创建(可能)500个线程.否则,如果我有8CPU处理器,我无法获得最大值.具有1000个线程的性能,我需要创建(可能)2000个线程来处理套接字.我怎么能理解"这个处理器可以处理X线程"?这是真的吗?
编辑:我想我可以创建一个正在观看节目的专家.也就是说,每个线程记录"我已经在X秒内完成了我的工作".和profiller处理此消息并决定创建一个线程或杀死一个线程.但是如何理解线程(或CPU)状态?
我听说"现代操作系统会清理关闭它时进程创建的所有线程"但是当我返回时main()
,我遇到了这些错误:
1)此应用程序已请求Runtime以不寻常的方式终止它.有关更多信息,请联系应用程序的支持团队.
2)在没有活动异常的情况下终止调用
我的实现看起来像这样(我现在正在编写,例如抱歉执行错误):
void process(int id)
{
while(true) { std::this_thread::sleep_for(std::chrono::milliseconds(1); } }
}
int main()
{
std::thread thr1(process, 0);
std::thread thr2(process, 1);
//thr1.detach();
//thr2.detach();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我取消注释detach();
,没有问题,但我的处理线程将是套接字读取器/写入器,它们将无限运行(直到主要返回).那怎么处理呢?怎么了?
编辑:也就是说,我不能逐个分离()每个线程,因为它们不会被正常终止(直到结束).哦,再次,如果我从DDOS窗口的X按钮关闭我的程序,(我的简单解决方案在这种情况下不起作用)我的detach(); 函数被传递,因为程序强制终止,这里再次出错:)
我想让它变得非常清晰和简单.如果我有1gb内存并且我正在尝试计算2gb文件的md5哈希怎么办?目前,我这样做:
private static string Md5Hash(byte[] input)
{
byte[] hash = MD5.Create().ComputeHash(input);
StringBuilder builder = new StringBuilder(32);
foreach(byte b in hash)
{ builder.Append(b.ToString("X2")); }
return builder.ToString();
}
// I'm using it like: 'Md5.AsString(File.ReadAllBytes(filePath))'
Run Code Online (Sandbox Code Playgroud)
那你的建议是什么?
我为一个简单的测试编写了一个简单的代码.
#include <stdio.h>
typedef struct
{
void* Data;
}List;
void x()
{
getchar();
int i;
List* myList[100000];
for(i = 0; i < 100000; i++)
{
myList[i] = (List*)malloc(sizeof(List)*1024*1024);
}
getchar();
for(i = 0; i < 100000; i++)
{
free(myList[i]);
}
}
int main()
{
x();
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我看过"taskmgr"中的程序,我看过: - 540K - 4.500K - 544K(什么是4K差异?)
我有一个关于string/char的简单问题.我试图实现这样的基本系统;
#include <stdio.h>
#include <string.h>
int main()
{
//I'll use 'char*' for socket receive buffer!
const char* input = "This is a test!";
char n[4];
strncpy(n, input, 4);
printf("%s\n%i\n", n, strlen(n));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到了这个输出:
Thisd0@
7
Run Code Online (Sandbox Code Playgroud)
怎么了?这是一个简单的for/while循环(IDK).