为什么我在练习中更喜欢一个或另一个?什么是技术差异,除了std::thread是一个类?
我刚观看了Bjarne Stroustrup对GoingNative'12演讲的录音.我有点困惑.
在本次演讲中,他特别讨论了vectorvs list问题,并建议在很多情况下vector即使你从中间插入和删除也要更快,因为编译器可以优化很多东西并且喜欢紧凑的结构.结论(据我所知)是:首先使用,vector然后再考虑是否需要其他东西.这听起来很合理,但考虑到第一次观察,我应该考虑哪些标准?我一直认为,如果你强烈插入/删除 - 使用列表.这里的一些主题也提出了类似的建议.看到
std :: vector与std :: list与std :: slist的相对表现?
和
现在根据Stroustrup我错了.
当然,我可以编写几个测试并试图弄清楚在每种特定情况下使用什么,但是有理论上的方法吗?
许多系统调用都close( fd )可以被信号中断.在这种情况下,通常-1会返回并errno设置EINTR.
问题是做什么是正确的?说,我仍然希望fd关闭它.
我能想到的是:
while( close( fd ) == -1 )
if( errno != EINTR ) {
ReportError();
break;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议更好/更优雅/标准的方式来处理这种情况吗?
更新:正如mux所注意到的,RESTART在安装信号处理程序时可以使用SA_ 标志.有人可以告诉我哪些功能可以保证在所有POSIX系统上都可以重启(不仅仅是Linux)?
据我所知,terminate()当异常处理存在一些问题时调用(通常它没有被捕获).我得到的只是一个错误行terminate called recursively.
谷歌搜索了一段时间后,我发现了很多例子
terminate called after throwing an instance of ... terminate called recursively
Run Code Online (Sandbox Code Playgroud)
但这不是我的情况.由于我没有关于异常类型的这一提示,我想知道这terminate called recursively本身意味着什么.
对不起,我无法提供代码,所以任何猜测都会有所帮助.我正在使用Ubuntu 11.04下的g ++ 4.5.2进行编译.
非常感谢,Alex.
我知道如何迭代字母表:
for c in {a..z}; do ...; done
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何遍历所有ASCII字符.有谁知道怎么样?
我必须在一个处理大约1000个描述符poll(我不能使用epoll它特定于Linux),我必须能够动态添加/删除它们(处理新连接并删除关闭).
这意味着我应该在每次迭代时重新组合描述符数组.
从技术角度来看,这是显而易见的,但有人知道这样做的一种美妙方式吗?
请不要在阅读之前认为它是重复的,有很多关于multithreading和的问题keyboard interrupt,但我没有发现任何考虑os.system,它看起来很重要.
我有一个python脚本,它在工作线程中进行一些外部调用.我希望它退出,如果我按,ctrl+c但看起来主线程忽略它.
像这样的东西:
from threading import Thread
import sys
import os
def run(i):
while True:
os.system("sleep 10")
print i
def main():
threads=[]
try:
for i in range(0, 3):
threads.append(Thread(target=run, args=(i,)))
threads[i].daemon=True
threads[i].start()
for i in range(0, 3):
while True:
threads[i].join(10)
if not threads[i].isAlive():
break
except(KeyboardInterrupt, SystemExit):
sys.exit("Interrupted by ctrl+c\n")
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
出人意料的是,如果我改变它工作正常os.system("sleep 10")来time.sleep(10).
可能重复:
如何在malloc之后获取内存块长度?
如果我有一个指针,是否可以了解分配了多少字节new?当我用Google搜索时,我找到了适用于Windows的解决方案:_msize()对于Mac : malloc_size(). 但Linux没什么.
如果没有,有人知道为什么它对程序员隐藏了吗?delete应该知道这样的信息.
更新:
据我所知,如果我有这个代码:
class A {
~A() {}
int m_a;
};
class B : public A {
~B() {}
int m_b;
};
int main() { A * b = new B(); delete b; return 0; }
Run Code Online (Sandbox Code Playgroud)
将调用A的析构函数,但仍将new释放所有分配的内存.这意味着它可以以某种方式计算只知道指针.那么将它从程序员中隐藏起来的原因是什么?
我正在尝试理解Linux(UNIX)低级接口,并且想要编写一个代码,将带有空洞的文件复制到一个新文件中(再次使用孔).
所以我的问题是,如何读取第一个文件直到第一个洞,但直到文件的最后?如果我没弄错的话,read()到达第一洞(EOF)时返回0.
我正在考虑逐字节地寻找并试图读取这个字节,但是我必须事先知道漏洞的数量.
我已经阅读了一些类似的问题,但那里描述的情况有点复杂.
我在堆中有一个bool b初始化false和两个线程.我确实理解操作bools是not atomic,但请直到最后阅读问题.
第一个线程只能设置b = true一次,不会对它做任何其他事情.第二个线程检查b一个循环,如果它true做了一些动作.
我是否需要使用某些同步机制(如互斥锁)来保护b?如果我不这样做会怎么样?随着ints我能明显得到任意值,当我读到,并在同一时间写.但是,bools只有true而且false我不介意一次得到false而不是true.这是一种潜力SIGSEGV吗?
我将编写一个代码,它将广泛执行其他程序.如果有人设置了set-user-id位(并且root是所有者),我不希望它具有root权限.所以我要在启动时放弃权限.
我的问题是:如何在程序中理解它是否以set-user-id模式运行?
好吧,我觉得这很愚蠢,但为什么下面的代码输出不同的行?
要打印第一行,我将地址写入数组的第一个字节,将其解释为指向uint16_t的指针,取值并逐个打印它的位.
对于第二行,我使用指向第一个字节的指针,将其解释为指向uint8_t的指针,取值并逐个打印它的位.然后对第二个字节执行相同的操作.
因为我不修改为数组分配的内存,只能以不同的方式解释它,我期望输出相同,但字节的顺序是不同的.
我可能会错过一些东西,但我唯一的猜测是间接运算符做了我不期望的事情.
#include <iostream>
#include <string.h>
int main() {
uint8_t u[2];
u[0] = 170;
u[1] = 85;
for(int i = 15; i >= 0; --i) {
printf( "%u", (((*((uint16_t*)u)) >> i) & 0x0001));
}
printf( "\n");
for(int i = 7; i >= 0; --i) {
printf( "%u", (((*((uint8_t*)u)) >> i) & 0x01));
}
for(int i = 7; i >= 0; --i) {
printf( "%u", (((*((uint8_t*)(u + 1))) >> i) & 0x01));
}
}
Run Code Online (Sandbox Code Playgroud)
Outout
0101010110101010
1010101001010101
Run Code Online (Sandbox Code Playgroud)
更新#1:请忽略分配,是示例代码不适用于每个操作系统,但它只是一个简化的示例. …
假设onclick处理程序设置为a <tr>是否可以为一个特定禁用/覆盖它<td>?
<tr onclick='somefunction()'>
<td> </td> <!--onclick should work here-->
...
<td> </td> <!--onclick should not work here-->
...
<td> </td> <!--onclick should work here-->
</tr>
当然,我可以<td>单独为它们设置它,或者将a的名称传递td给函数,并根据这个名称决定做什么,但似乎应该有一个更简单的解决方案.