Tag: multithreading

睡眠function是睡眠所有线程还是只调用它的人?

我在linux(Centos)上用pthread编程? 我想让线程在短时间内等待一些事情。 我正在尝试使用sleep(),nanosleep()或者usleep(),或者也许可以做到这一点。 我想问一下:睡眠function是睡眠所有线程还是只调用它的人? 任何建议或参考将不胜感激。 void *start_routine () { /* I just call sleep functions here */ sleep (1); /* sleep all threads or just the one who call it? what about nanosleep(), usleep(), actually I want the threads who call sleep function can sleep with micro-seconds or mili-seconds. */ … } int main (int […]

为什么操作系统需要/维护内核线程?

以下是我遇到的三种线程模型。 基于以下3种体系结构,对于我来说,除了作为POSIX.1C的一部分引入的用户线程之外,还存在一些称为内核线程的新内容。 这是1-1型号 这是N-1型号。 这是混合模型。 对于内核线程,我已经经历了很多关于SO的问题。 这看起来更相关的链接以便澄清。 在进程级别,对于Linux加载器(例如)加载的每个用户进程,内核不会为执行用户进程提出的机器指令分配相应的内核进程。 用户进程只需要内核模式执行,当它需要来自内核模块的工具时[如malloc()/ fork()]。 用户进程的调度由OS调度程序完成并分配CPU核心。 例如,用户进程不需要内核执行模式来执行指令 a=a+2;//a is my local variable in a user level C function 我的问题: 1)那么,内核级线程的目的是什么? 为什么操作系统需要为用户级进程的相应用户线程维护内核线程(另外)? 用户模式编程器是否可以通过编程为给定的用户进程选择上述三种线程模型中的任何一种? 在我理解第一个问题的答案后,一个相关的补充是, 2)内核线程实际上是由OS调度程序而不是用户线程调度的吗?

多个线程调用相同的函数是否安全?

例如,安全吗: void AddTwo(int &num) { num +=2; } void ThreadProc(lpvoid arg) { AddTwo((int)arg); } 如果4个线程同时执行此操作,是否会发生这种情况? 谢谢

很难跟踪内存损坏 – 运行Valgrind时运行正常,没有错误

我们有一个复杂的程序,在重载输入(实际上是任何输入)上运行良好,没有实现multithreading。 我们用线程池实现了multithreading,给定这些输入参数我得到了这些结果: ( 注意 :我说没有错误 ,这意味着我已经用valgrind -v进行了测试,当我说没有内存泄漏时 ,这意味着我已经用valgrind –leak-check=full -v测试了它)。 small_file:成功运行超过1个worker(线程),没有valgrind错误,没有内存泄漏 medium_file:使用1个worker成功运行,没有错误/内存泄漏。 有> 1名工人,我得到:a。 通常是堆损坏错误,b。 双自由。 当使用valgrind -v运行> 1个worker时,程序成功完成。 此外,没有从valgrind打印错误,即ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2) 。 现在我从valgrind开始没有得到任何错误,我该怎么做才能找到这个复杂而庞大的应用程序中的内存损坏问题? DevelopmentEnvironment: Ubuntu,64bit,gcc版本:4.7.2和4.8.1(不同的计算机,更新版本的Ubuntu)。

如何干净地中断recv调用中的线程阻塞?

我有一个用C编写的multithreading服务器,每个客户端线程看起来像这样: 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”); […]

std :: signal和std :: raise线程安全吗?

C和C ++标准支持信号的概念。 但是,C11标准表示无法在multithreading环境中调用函数signal(),或者行为未定义。 但我认为信号机制本质上适用于multithreading环境。 引用C11标准7.14.1.1.7 “在multithreading程序中使用此函数会导致未定义的行为。实现的行为就像没有库函数调用信号函数一样。” 对此有何解释? 以下代码不言而喻。 #include #include using namespace std; void SignalHandler(int) { // Which thread context here? } void f() { // // Running in another thread context. // raise(SIGINT); // Is this call safe? } int main() { // // Register the signal handler in main thread context. // signal(SIGINT, […]

是否可以将硬件解复用用于高负载网络服务器?

例如,对于使用TCP / IP的异步IO(使用POSIX轮询/选择或更高级的epoll,kqueue,poll_set,IOCP),网络驱动程序通过不同( 硬件解复用器 )CPU核心的中断启动,接收消息和转储它们是内核级别的单个( 多路复用器 )缓冲区。 然后,我们的线程接受器通过使用epoll / kqueue / poll_set / IOCP从这个单独的缓冲区接收一个消息套接字描述符列表,它们在不同的CPU核心上运行的线程(在线程池中)反复散布( 解复用器 ) 。 简而言之,方案如下:硬件中断( 硬件解复用器 ) – >内核空间中的网络驱动程序( 多路复用器 ) – >用户空间中的用户接受器,使用epoll / kqueue / poll_set / IOCP( 解复用器 ) 是不是更容易,更快,摆脱最后两个链接,并只使用“硬件解复用器”? 一个例子。 如果网络数据包到达,网卡将中断CPU。 在当今的大多数系统中,这些中断分布在核心上。 即这项工作是硬件解复用器。 收到这样的中断后,我们可以立即处理该网络的消息并等待下一个中断。 通过使用CPU中断,所有用于解复用的工作都在硬件级别完成。 在Cortex-A5 MPCore中: http : //infocenter.arm.com/help/index.jsp? topic = / com.arm.doc.ddi0434b / CCHDBEBE.html 在所有Linux中,实时* nix(例如QNX)中是否可行的方法,并且是否存在使用此方法的公共项目,可能是ngnix? 更新: […]

Delphi是否有任何与C的volatile变量等价的东西?

在C和C ++中,变量可以标记为volatile ,这意味着编译器不会对其进行优化,因为它可以在声明对象外部进行修改。 在Delphi编程中是否有相同的东西? 如果不是关键字,也许可以解决? 我的想法是使用绝对 ,但我不确定,这可能会引入其他副作用。

如何停止正在运行的pthread线程?

如何立即退出或停止线程? 当用户输入答案时,如何立即停止? 我想让它重置每一个问题。 这是涉及线程的代码 int q1() { int timer_start; char ans[] = “lol”; char user_ans[50]; timer_start = pthread_create( &xtimer,NULL,(void*)timer_func,(void*)NULL); printf(“What is the capital city of Peru?\n”); while(limit){ scanf(“%s”,user_ans); if(limit) { if(!strcmp(user_ans, ans)) { // printf(“YAY!\n”); score++; // q2(); } else { game_over(); } } } }

pthreads中的内存模型规范

是否有任何保证何时在一个线程中的内存写入在使用pthread s的其他线程中可见? 与Java相比,Java语言规范有一个部分,它指定了锁和内存的交互,从而可以编写可移植的multithreadingJava代码。 是否有相应的pthreads规范? 当然,你总是可以让共享数据变得不稳定,但这不是我所追求的。 如果这取决于平台,是否有事实上的标准? 或者是否应该使用另一个线程库?