Tag: multithreading

使用C / Pthreads:共享变量需要是不稳定的吗?

在C编程语言中,Pthreads作为线程库; 在线程之间共享的变量/结构是否需要声明为volatile? 假设他们可能受到锁定或不受保护(可能是障碍)。 pthread POSIX标准对此有任何发言权,是依赖于编译器还是不依赖于编译器? 编辑添加:感谢您的答案。 但是,如果你不使用锁,那该怎么办? 如果你使用障碍物怎么办? 或者使用比较和交换等原语直接和primefaces地修改共享变量的代码……

如何通知select()立即返回?

我有一个工作线程正在侦听TCP套接字以获取传入流量,并缓冲接收到的主线程要访问的数据(让我们称之为套接字A )。 但是,工作线程也必须做一些常规操作(比如每秒一次),即使没有数据进入。因此,我使用select()超时,这样我就不需要继续轮询。 (注意,在非阻塞套接字上调用receive()然后hibernate一秒钟并不好:即使主线程可能无法立即处理它,主线程也应立即可用传入数据。因此需要缓冲。) 现在,我还需要能够发信号通知工作线程立即执行其他操作; 从主线程,我需要让工作线程的select()返回。 现在,我已经解决了这个问题(从这里和这里基本采用的方法): 在程序启动时,工作线程为此创建了一个数据报(UDP)类型的附加套接字,并将其绑定到某个随机端口(让我们称之为套接字B )。 同样,主线程创建一个数据报套接字用于发送。 在调用select() ,工作线程现在在fd_set列出A和B. 当主线程需要发出信号时,它会将几个字节发送到sendto()几个字节到localhost上的相应端口。 回到工作线程中,如果在select()返回后B保留在fd_set ,则调用recvfrom()并忽略接收的字节。 这似乎工作得很好,但我不能说我喜欢这个解决方案,主要是因为它需要为B绑定一个额外的端口,还因为它增加了几个额外的套接字API调用,这可能会失败我猜 – 我不知道真的想要找出每个案件的适当行动。 我认为理想情况下,我想调用一些以A作为输入的函数,除了使select()返回之外什么都不做。 但是,我不知道这样的function。 (我想我可以例如shutdown()套接字,但副作用不是真的可以接受:) 如果这是不可能的,那么第二个最佳选择是创建一个比真正的UDP套接字更糟糕的B ,并且实际上并不需要分配任何有限的资源(超出合理的内存量)。 我想Unix域套接字就可以做到这一点,但是:解决方案不应该比现在的解决方案少得多,尽管有一些适量的#ifdef东西很好。 (我主要针对Windows和Linux – 并且顺便编写C ++。) 请不要建议重构以摆脱两个单独的线程。 这种设计是必要的,因为主线程可能会被长时间阻塞(例如,做一些密集的计算 – 我无法从最里面的计算循环开始定期调用receive() ),同时,有人需要缓冲传入的数据(由于我无法控制的原因,它不能是发送者)。 现在我正在写这篇文章,我意识到有人肯定会简单地回复“ Boost.Asio ”,所以我刚刚看了它……但是找不到明显的解决方案。 请注意,我也不能(轻松地)影响套接字A的创建方式,但如果需要,我应该能够让其他对象包装它。