真的有两个问题:
(1)是否有关于配置文件放置的标准/约定?对于系统或准系统程序,它们似乎通常位于/ etc中.对于没有足够的/ etc权限的普通应用程序或pgms,似乎不太清楚.
(2)有多种方法可以为程序提供信息,例如环境变量,命令行选项,ini文件等.在处理程序选项中,是否存在优先级的标准层次结构?例如命令行选项是否覆盖初始化文件?反之亦然?或者这完全取决于开发人员?
Boost Libraries似乎没有设置线程优先级的设备.这是在Linux上使用的最佳代码还是有更好的方法?
boost::thread myThread( MyFunction() );
struct sched_param param;
param.sched_priority = 90;
pthread_attr_setschedparam( myThread.native_handle(), SCHED_RR, ¶m);
Run Code Online (Sandbox Code Playgroud)
我没有很多Linux编程经验.
这有效吗?可接受的做法?
typedef vector<int> intArray;
intArray& createArray()
{
intArray *arr = new intArray(10000, 0);
return(*arr);
}
int main(int argc, char *argv[])
{
intArray& array = createArray();
//..........
delete &array;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 过去没有线程经验,C++中的线程技术对于初学者来说是最简单的吗?boost :: thread还是pthreads?
我对C++比较陌生.最近的赋值要求我将大量的char缓冲区(从结构/套接字等)转换为字符串.我一直在使用以下变体,但它们看起来很尴尬.有没有更好的方法来做这种事情?
#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::endl;
char* bufferToCString(char *buff, int buffSize, char *str)
{
memset(str, '\0', buffSize + 1);
return(strncpy(str, buff, buffSize));
}
string& bufferToString(char* buffer, int bufflen, string& str)
{
char temp[bufflen];
memset(temp, '\0', bufflen + 1);
strncpy(temp, buffer, bufflen);
return(str.assign(temp));
}
int main(int argc, char *argv[])
{
char buff[4] = {'a', 'b', 'c', 'd'};
char str[5];
string str2;
cout << bufferToCString(buff, sizeof(buff), str) << endl;
cout << bufferToString(buff, sizeof(buff), str2) << endl;
}
Run Code Online (Sandbox Code Playgroud) 在计算签入版本之间的差异时,哪些源代码控制产品具有忽略空格,大括号等的"差异"功能?我似乎记得Clearcase的差异做了这个,但Visual SourceSafe(或至少我使用的版本)没有.
我问的原因可能很典型.团队中四个完全合理的开发人员有四种完全不同的格式化代码的方式.在检查出其他人最后更改的代码后,每个人都会立即运行某种程序或编辑器宏来按照他们喜欢的方式格式化.他们进行实际的代码更改.他们签入他们的更改.他们去度假.两天后,这个已经运行两年的计划爆炸了.分配给bug的开发人员在版本之间进行差异,并发现204个差异,其中只有3个具有任何重要性,因为差异算法是蹩脚的.
是的,你可以有编码标准.大多数人都觉得它们很可怕.一个解决方案,每个人都可以吃蛋糕,吃它似乎更好.
=========
编辑:感谢大家提出一些很好的建议.
我从中得到的是:
(1)具有插入式差异的源控制系统是优选的.
(2)找到具有合适选项的差异.
(3)使用良好的源格式化程序并确定签入标准.
听起来像是个计划.再次感谢.
我有一个用C编写的多线程服务器,每个客户端线程看起来像这样:
ssize_t n;
struct request request;
// Main loop: receive requests from the client and send responses.
while(running && (n = recv(sockfd, &request, sizeof(request), 0)) == sizeof(request)) {
// Process request and send response.
}
if(n == -1)
perror("Error receiving request from client");
else if(n != sizeof(act))
fprintf(stderr, "Error receiving request from client: Incomplete data\n");
// Clean-up code.
Run Code Online (Sandbox Code Playgroud)
在某些时候,客户满足必须断开连接的特定标准.如果客户端定期发送请求,这很好,因为可以通知响应中的断开连接; 但是,有时客户端需要很长时间才能发送请求,因此客户端线程最终会在recv调用中阻塞,并且客户端在下一个请求/响应之前不会断开连接.
当客户端线程在recv呼叫中阻塞时,是否有一种干净的方法来断开客户端与另一个线程的连接?我试过,close(sockfd)但这会导致错误Error receiving request from client: Bad file descriptor发生,这实际上是不准确的.
或者,我有更好的方法来处理错误吗?
我目前正在使用select循环来管理代理中的套接字.此代理的一个要求是,如果代理向外部服务器发送消息并且在特定时间内未收到响应,则代理应关闭该套接字并尝试连接到辅助服务器.结束发生在一个单独的线程中,而select线程阻塞等待活动.
我无法弄清楚如何检测这个套接字是否专门关闭,以便我可以处理故障.如果我在另一个线程中调用close(),我得到一个EBADF,但是我无法判断哪个套接字已关闭.我试图通过异常fdset检测套接字,认为它将包含已关闭的套接字,但我没有得到任何返回.我也听说调用shutdown()会将FIN发送到服务器并收回FIN,这样我就可以关闭它; 但重点是我试图通过在超时期限内没有得到响应来关闭它,所以我也不能这样做.
如果我的假设是错误的,请告诉我.任何想法,将不胜感激.
编辑:响应有关使用选择超时的建议:我需要异步关闭,因为连接到代理的客户端将超时,我不能等待选择被轮询.这只有在我将选择时间变得非常小的情况下才会起作用,这会不断地进行轮询和浪费我不想要的资源.
我正在编写一个程序,有一个主线程和一些工作线程,我想让信号处理正确.我的问题如下:
主线程启动并执行所有分配
主线程设置SIGINT信号处理程序
主线程启动工作线程.工作线程不需要特殊清理,但是它们可以在系统调用或信号量上休眠.
收到SIGINT时,我的理解是只有一个线程收到它.因此,如果线程在系统调用或信号量上休眠,它们就不会被唤醒,我将无法pthread_join我的工作线程并在我的主线程中进行所有必要的清理.
以下信号处理程序可以解决我的问题吗?
void term(int sig)
{
g_do_cleanup = 1;
pthread_kill(worker_1_id, some_other_signal);
...
pthread_kill(worker_2_id, some_other_signal);
}
Run Code Online (Sandbox Code Playgroud)
我期待的是,一旦接收到SIGINT,所有线程将用另一个信号发出信号,退出阻塞呼叫,看到g_do_cleanup标志并优雅地退出.
欢迎任何关于如何正确执行此操作的评论或链接.
编辑:我不是在寻找一种方法来唤醒多个线程等待特定条件,所以我不认为pthread_cond_signal方法是我正在寻找的.我想要的是: