Tag: multithreading

使用两个线程在C / C ++中操作不同的数组索引时,是否需要同步?

假设我有一个如下定义的数组: volatile char v[2]; 我有两个线程(分别用A,B表示)操纵数组v 。 如果我确保A,B在任何时候使用不同的索引,也就是说,如果A现在正在操纵v[i] ,那么B要么什么都不做,要么操纵v[1-i] 。 我想知道这种情况需要同步吗? 我已经提到了这个问题 ,但我认为它在Java中是有限的。 我之所以提出这个问题的原因是,我在一个大型项目中一直在努力解决一个奇怪而罕见的错误,直到现在,我能解释这个错误的唯一原因是需要同步以上操纵。 (由于这个bug非常罕见,我很难certificate我的推测是否属实) 编辑:对于v ,可以进行读取和修改。

在C / C ++中,volatile变量是否保证最终在线程之间具有一致的语义?

任何通常遵循的标准(ISO C或C ++,或任何POSIX / SUS规范)是否有任何保证,由多个线程访问的变量(可能标记为volatile)(未被互斥锁保护)将最终保持一致如果分配给? 要提供一个特定示例,请考虑共享变量v的两个线程,初始值为零。 线程1:v = 1 线程2:while(v == 0)yield(); 线程2是否保证最终终止? 或者它可以想象永远旋转,因为缓存一致性永远不会启动并使得赋值在线程2的缓存中可见? 我知道C和C ++标准(在C ++ 0x之前)完全没有关于线程或并发的说法。 但我很好奇,如果C ++ 0x内存模型,或pthreads,或其他任何东西,保证这一点。 (显然这确实可以在Windows上运行32位x86;我想知道它是否可以依赖于某些东西,或者它是否恰好在那里工作)。

将struct作为参数传递给pthread

好吧,我试图通过struct将一对数字传递给pthread pthread_create函数。 但是我传递的数字和调用函数时得到的数字是不同的和随机的 这是struct struct Pairs { long i,j; }; 并在主要内部 void main() { long thread_cmp_count = (long)n*(n-1)/2; long t,index = 0; struct Pairs *pair; pair = malloc(sizeof(struct Pairs)); cmp_thread = malloc(thread_cmp_count*sizeof(pthread_t)); for(thread = 0;(thread < thread_cmp_count); thread++){ for(t = thread+1; t < n; t++){ (*pair).i = thread; (*pair).j = t; pthread_create(&cmp_thread[index++], NULL, Compare, (void*) […]

GTK3和multithreading,取代已弃用的function

我想在我的使用线程的应用程序中替换已弃用的函数gdk_threads_enter()/leave() 。 现在的应用程序,工作完美( 虽然我不确定这是否是正确的方法 )。 我的主循环,运行gtk_main和信号处理程序。 当我收到一个开始按钮时,我启动一个在主要背景中运行的线程。 如何从该线程更新GUI。 我知道根据GTK3和GDK3的文档,他们说通过使用避免它 gdk_threads_add_idle() 要么 gdk_threads_add_timeout() 但是,如果我希望仅在单击开始时才进行更新,我该怎么做呢? 有什么例子吗? 我不是问如何使用gdk_threads_add_idle() ,我问的是如何在单击start后没有线程的情况下在main中运行worker函数。 单击按钮 – >在先前的线程中启动工作器function – >在GUI窗口中更新大量的GUI元素。

为什么线程称为轻量级进程?

线程是“轻量级的”,因为大部分开销已经通过创建其进程来完成。 我在其中一个教程中找到了这个。 有人可以详细说明它究竟意味着什么吗?

处理multithreading程序中的异步信号

Linux Programming Interface提到了一种在multithreading程序中处理异步信号的方法: 所有线程都阻止进程可能接收的所有异步信号。 最简单的方法是在创建任何其他线程之前阻止主线程中的信号。 随后创建的每个线程都将inheritance主线程信号掩码的副本。 使用sigwaitinfo() , sigtimedwait()或sigwait()创建一个接受传入信号的专用线程。 这种方法的优点是同步接收异步生成的信号。 由于它接受传入信号,专用线程可以安全地修改共享变量(在互斥控制下)并调用非异步安全function。 它还可以发信号通知条件变量,并且可以实现其他线程和进程通信和同步机制。 现在的问题是: 当内核想要传递信号时,它会选择任意一个进程内的线程。 从哪里可以知道将信号传递给专用线程? pthread API是非同步安全的函数。 那么我们如何在信号处理程序中使用它们?

当获取它的线程退出时,Mutex会发生什么?

假设有两个线程,主线程和线程B(由main创建)。 如果B获得了一个互斥锁(比如pthread_mutex)并且在没有解锁锁的情况下调用了pthread_exit。 那么互斥体会发生什么? 它变得免费吗?

C中的multithreading服务器/客户端实现

我刚开始学习基本的网络概念。我正在尝试在C中实现multithreading服务器 – 客户端程序。但问题是不是为客户端运行多个windows / terminal / instance,我应该使用fork()来创建客户端的子项.so通过创建客户端的子节点,将创建多个客户端。现在,每个子客户端都将在线程上与服务器通信。 之前我创建了类似的编程,但是对于多个客户端,您必须为客户端打开多个窗口并运行所有这些窗口。 我无法修改我的代码(在服务器和客户端的代码。我认为服务器一个是好的。但我不知道在客户端程序中fork()的位置以及应该进行哪些更改)。 实际上我不想打开多个窗口来运行多个客户端,这就是为什么我使用fork()创建它的多个副本。是否有任何其他方式我可以创建多个客户端并将它们连接到我的服务器prog线程。 服务器: // socket server example, handles multiple clients using threads #include #include //strlen #include //strlen #include #include //inet_addr #include //write #include //for threading , link with lpthread //the thread function void *connection_handler(void *); int main(int argc , char *argv[]) { int socket_desc , client_sock , […]

multithreading可以抑制编译器优化吗?

我偶然发现有几次将部分程序与OpenMP并行化只是为了注意到最后,尽管具有良好的可扩展性,但由于单线程情况的性能不佳,大多数预见的加速都会丢失(如果与串行版)。 网络上出现的这种行为的常见解释是编译器生成的代码在multithreading情况下可能更糟 。 无论如何,我无法在任何地方找到解释为什么assembly可能更糟的参考。 那么,我想问一下编译器的人是: multithreading可以抑制编译器优化吗? 万一,性能怎么会受到影响? 如果它可以帮助缩小问题,我主要对高性能计算感兴趣。 免责声明 :正如评论中所述,以下部分答案可能在将来过时,因为他们简要讨论了在提出问题时编译器处理优化的方式。

是否有必要锁定一个*只从一个线程写入*而*只读取*另一个?

我有两个线程在运行。 他们共享一个arrays。 其中一个线程向数组添加新元素(并删除它们),另一个使用此数组(仅限读取操作)。 在我添加/删除数组或从中读取数组之前,是否有必要锁定数组? 更多详情: 我需要继续在另一个线程中迭代整个数组。 如前所述,那里没有写操作。 “只需扫描像固定大小的循环缓冲区” 在这种情况下,最简单的方法是使用锁。 然而,锁可能非常慢。 如果可以避免使用锁,我不想使用锁。 此外,从讨论中得出,可能没有必要(实际上不是)锁定arrays上的所有操作。 只是锁定数组的迭代器管理(将由另一个线程使用的计数变量)就足够了 我不认为这个问题“太宽泛”。 如果仍然如此,请告诉我。 我知道这个问题并不完美。 为了能够解决问题,我必须至少结合3个答案 – 这表明大多数人无法完全理解所有问题,并被迫做一些猜测工作。 但大多数都是通过我试图纳入问题的评论得出的。 答案帮助我非常客观地解决了我的问题,我认为这里提供的答案对于从multithreading开始的人来说是非常有用的资源。