我正在设计一个远程线程基本协议。目前,我们只需要互斥(即监视器)和信号量。其主要思想是,不需要有一个中央权威——原语应该在对它们感兴趣的对等方之间进行协调
几周来,我在纸上和脑子里反复思考了一些想法;但我想我真的应该看看以前的文献。有吗
它将在XMPP上运行-但这是一个实现细节。我只是在寻找一个关于实际协议流的规范之类的东西——因此,文献来源于什么协议并不重要
非常感谢。分布式互斥体是复杂的结构。您需要处理基于单个机器的实现所不存在的所有奇怪情况。特别是,您需要处理代理丢失与组的通信,并且仍然锁
一些语言提供了一个volatile修饰符,该修饰符被描述为在读取支持变量的内存之前执行“读取内存屏障”
读存储器屏障通常被描述为确保CPU在屏障之后执行读取请求之前,已经在屏障之前执行了请求的读取。然而,使用这个定义,似乎仍然可以读取过时的值。换言之,以特定顺序执行读取似乎并不意味着必须参考主存储器或其他CPU,以确保后续读取的值实际反映系统中在读取屏障时的最新值,或在读取屏障后后续写入的值
那么,volatile真的能保证读取最新的值吗?或者(喘息!)所读取的值至少与屏障之前的读取一样是最新的
我想知道是否有可能不使用100%的cpu,而是使用特定数量的cpu来运行应用程序。
我看到了这个的不同用法
我们可以更好地平衡并发应用程序(我们可能希望平衡应用程序的50%,以获得公平的应用程序/代理/…)
我还想知道,如果CPU不是全速运行,而是在较低的水平(比如80%)运行,功耗是否会更好
你的想法是什么
谢谢
欢迎举例:)您可以很容易地做到这一点。转到BIOS并将频率降低到所需的百分比,此时,您也可以降低CPU的V核心电压。
在Windows7和WindowsServer2008R2中
对不起。。。羞愧-我没有运行调试模式,所以错误显示在错误的行上。在调试模式下,显示右边的一行,错误是一个简单的“不要访问超出其边界的数组”错误键入-我引用了一个数组,但访问了另一个数组
当我从另一个线程清空NSMutableArray时,为什么访问NSMutableArray的计数会产生SIGABRT?我以为@synchronized应该按照它的名字来做
NSMutableArray *sourceImageRepArray;
...
@synchronized(self)
{
NSL
我有一个DGRect::draw(HWND-HWND),它只是在HWND窗口句柄上绘制一个空白的HBITMAP。
如果我从main()调用它,我可以正常工作。如果从DGRDPServer::DGRDPServer()构造函数调用,它甚至可以正常工作,该构造函数是qtcserver派生的。它在DGRDPServer::listen(qint64端口)中也能正常工作。hwnd在DGRDPServer构造函数中传递。当我从DGRDPServer::incomingConnection(int-sock
我在阅读线程和进程之间的差异时遇到了这个语句。请解释。我认为它试图说创建一个新线程并在线程之间通信是相当高效/廉价的,而创建一个新进程并在进程之间通信是相当低效/昂贵的
不过,这有点笼统——不同操作系统的成本差异很大。在Windows上,这一说法比在大多数Unix实现上“更为正确”(Unix试图降低进程创建成本),甚至在Windows上,说线程“几乎没有开销”也是不正确的。创建一个新线程还远远不是一个简单的操作。我认为它试图说创建一个新线程并在线程之间通信是相当高效/便宜的,而创建一个新进程并在
我创建了一个抽象基类,以允许任务的多个实现,可以通过MFC对话框进行一般调用。如果用户单击“取消”,则需要能够中断此任务
abstract\u dll.h:
class abstract_dll
{
public:
virtual void my_task(CFeedback *fb)=0;
}
class concrete_dll
{
virtual void my_task(CFeedback *fb)
{
//do some work
监视器和信号量之间的主要区别是什么?信号量允许多个线程(最多一个设置的数字)访问共享对象。监视器允许对共享对象进行互斥访问
Monitor是一个设计用于从多个线程访问的对象。监视器对象的成员函数或方法将强制互斥,因此在给定时间只有一个线程可以对该对象执行任何操作。如果一个线程当前正在执行该对象的成员函数,那么尝试调用该对象成员函数的任何其他线程都必须等待第一个线程完成
信号量是较低级别的对象。您可以使用信号量来实现监视器。信号量本质上只是一个计数器。当计数器为正时,如果线程尝试获取信号量,则允
据我所知,actor基本上是在线程之上实现的轻量级线程,在一个小的共享线程池中运行许多actor
在这种情况下,在actor中使用阻塞操作会阻塞底层线程。这不是一个正确性问题,因为actor库会根据需要生成更多的线程(是吗?),但最终会产生大量的线程,从而否定了使用actor的好处
鉴于此,当您需要执行此类IO操作时,参与者如何工作?是否存在“actor block”的操作,在让线程继续执行其他操作时挂起actor(就像在让CPU继续执行其他操作时挂起线程的阻塞操作一样),或者所有内容都是用CP
奇点-如果某个线程成功锁定了互斥锁,则可以确定在原始线程释放锁之前,没有其他线程能够锁定该线程
非忙等待-如果某个线程试图锁定被第二个线程锁定的线程,则第一个线程将被挂起(并且不会消耗任何CPU资源),直到第二个线程释放该锁为止。此时,第一个线程将唤醒并继续执行,并将互斥锁锁定
来自:使用POSIX线程进行多线程编程
问题:我以为线程会锁定互斥变量。线程不锁定其他线程?
上面的粗体陈述是什么意思?一个线程如何锁定其他线程?更正:
如果某个线程成功锁定了互斥锁,则可以确保在原始线程释放锁之前,没有
useI正在编写python脚本,以检查url是否正常工作。脚本将把url和响应代码写入日志文件。
为了加快检查速度,我使用线程和队列
如果要检查的url数量很小,那么脚本工作得很好,但是当url数量增加到数百个时,一些url将从日志文件中丢失
有什么我需要修理的吗
我的剧本是
#!/usr/bin/env python
import Queue
import threading
import urllib2,urllib,sys,cx_Oracle,os
import time
from ur
我正在编写一个针对SQL Server的轮询系统。检索任务时,使用Task.Factory.StartNew()将任务卸载到新线程。整个过程都在一个无止境的循环中,我只允许N个并发任务
while(true)
{
// create connection
while(_concurrentTasks < _allowedTasks)
{
// get job info
if(!reader.HasRows) break; //
对于非特定语言的线程和并发编程方面的书籍,有什么建议吗?书中介绍了不同类型的互斥体、等待条件、信号量及其与线程应用程序的连接的概念
如果您有一本特定于语言的书,我希望它不涉及托管或脚本语言,如Java、C#、Python等。在特定操作系统的上下文中学习并发性如何?我在MINIX操作系统的体系结构课程中学习了多线程等。MINIX的优点在于,它很容易让学生理解。这本书是“MINIX书”,如图所示。这是一本介绍并发编程同步原理的免费(两种意义上的)教科书。另外:尽管你不想要特定语言的书,我不得不推荐您
在我的申请中,我有以下情况:
对象发出信号removeCharacter
removeCharacter有a部分和B部分,完成a部分后,它会触发信号removePath
插槽onRemovePath连接到信号removePath,将删除角色的路径,然后触发信号pathRemoved
插槽finishRemovingCharacter连接到信号pathRemoved,并将完成剩余的字符删除过程
我不想在触发removePath信号时总是执行此finishRemovingCharacter逻辑
我写了一些线程代码,其中似乎有一个错误的假设,即整数是线程安全的。现在看来,虽然它们是安全的,但我对它们的使用并不是线程安全的。我使用一个全局整数ThreadCount来保存线程数。在线程创建过程中,我增加线程数。在线程销毁期间,我将其递减。创建完所有线程后,我等待它们完成(ThreadCount应降至0),然后编写最终报告并退出
但有时(5%),我从未达到0,即使事后检查我的日志显示所有线程都运行并完成了。所以所有的迹象都表明ThreadCount被践踏了。我一直在告诉自己,这是不可能的,因为
我有一个简单的Fortran代码,尽管使用了omp\u set\u num\u threads()子例程,但我无法设置线程数,即输出显示我只使用了1个线程。我还尝试了导出OMP\u NUM\u THREADS=4——没有结果
我不知道出了什么问题,这是一段代码:
program test
use omp_lib
implicit none
integer :: i, tnr,t
call omp_set_num_threads( 4 )
t = omp_get_n
我正在尝试使用POSIX线程编写一个C程序,将一个正方形分成4,然后将其中的一些8再分,直到满足某些条件。。一般来说,程序是这样的:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define checkResults(string, val) { \
if (val) { \
p
我正在阅读有关旧windows线程系统的文章,其中有一个区别我不理解,从msdn中,您可以阅读以下内容:
“线程池中有两种类型的工作线程:I/O和非I/O。I/O工作线程是在可警报等待状态下等待的线程。工作项作为异步过程调用(APC)排队给I/O工作线程。”。如果工作项应在可警报状态下等待的线程中执行,则应将其排入I/O工作线程的队列。“
为什么要使用IO工作线程而不是非工作线程?您仍然可以像在非IO工作线程中读取文件那样执行IO操作吗?
谢谢介意分享这个链接吗?
在TILE Gx体系结构的Linux内核自旋锁实现中,看起来它们在锁定时(仅在解锁时)不会发出任何内存障碍:
然后我不明白为什么指令不能在锁定之上重新排序,这会导致程序员认为在持有锁时执行的指令在获得锁之前实际执行
其他体系结构似乎至少有一个编译器障碍:
手臂的旋转锁有一个记忆屏障:
谨此陈辞:
x86的自旋锁有一个编译器障碍:
谨此陈辞:
为什么TILE Gx不同?我认为它的记忆模型和ARM的记忆模型一样弱。为什么它们甚至没有编译器屏障呢?锁定函数arch\u spin\u lo
我发现只有一个内核在全速工作,就像上面的代码一样。但是我要说的是,所有四个线程都在一起工作,cpu使用率很高。看来多线程和Map冲突了,对吗?如果没有,如何实现我最初的目标?提前谢谢你所以我认为你是在尝试一种启发式,库假设只有少量任务时,只使用一个线程是最快的
此代码使我的计算机上的所有线程达到最大值:
let len = 25000000
let map = Map.ofArray[|for i =1 to len do yield (i,i+1)|]
let maparr = [|map;m
假设我们在控制器中有一个动作。在每次请求时,许多用户都会调用performLogin
def performLogin( ) = {
Async {
// API call to the datasource1
val id = databaseService1.getIdForUser();
// API call to another data source different from above
// This p
我有一个正在运行的线程应用程序,它正在计算一些更长的计算
procedure TForm.calculationInThread(value: Integer);
var aThread : TThread;
begin
aThread :=
TThread.CreateAnonymousThread(
procedure
begin
myCalculation(value);
end
);
aTh
我在谷歌和stackoverflow上浏览和阅读了一番之后,决定问这个问题,并在我的四核机器上用Fortran和Ubuntu 12.04做了一些实验,最终发现自己回到了原点。整个故事就是这样
了解了并行计算之后,我决定选择OpenMP。我可以找到一个线程,但是在第一课之后无法继续,因为我的计算机从未创建过多个线程,即使在使用中给出的命令之后也是如此。然后我在stackoverflow.com上搜索,找到了一个调用omp_set_dynamic(0)的解决方案。但是,在我的终端上键入此命令后,会出
我需要使用MongoDB实现一些锁定机制,以防止数据不一致,但允许脏读
条件:
只有在没有读取锁和无写入锁的情况下,才能获取写入锁
只有在没有写入锁的情况下,才能获取读取锁
单个文档上可以有多个并行的读取锁
必须有某种超时机制:如果(无论出于何种原因)某个进程没有释放其锁,应用程序必须能够恢复
只需忽略查询中的所有锁,即可实现脏读
(缺少写入进程不是本主题的一部分)
为什么读取和写入锁定/为什么不只使用写入锁定:
假设我们有两个集合:联系人和类别。这是一个n-m关系,其中每个联系人都有一个类
我正试图通过使用线程来加速一个大向量上昂贵的计算。我的函数使用一个向量,计算一个新值的向量(它不聚合,但必须保留输入顺序),然后返回它。然而,我正在努力弄清楚如何生成线程,为每个线程分配向量切片,然后收集和合并结果
// tunable
const NUMTHREADS: i32 = 4;
fn f(val: i32) -> i32 {
// expensive computation
let res = val + 1;
res
}
fn main() {
对于一个项目,我使用InputStream作为Ring的响应体。这非常有效,但是,服务器在流式传输单个响应时不会响应任何其他请求
例如,当我启动五个并发请求时,只有第一个请求启动。然后是下一个,等等
这是我的代码的简化版本。我使用cljhttp获取维基百科图像的输入流,并将其直接传递给响应
(ns streaming.server
(:require [ring.adapter.jetty :refer [run-jetty]]
[clj-http.client :a
假设我们有一个能够自我变异的结构,它必须作为后台操作的一部分发生:
struct Thing {
var something = 0
mutating func operation(block: () -> Void) {
// Start some background operation
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORIT
我正在编写一个为facebook API服务的应用程序;分享,分享等。。我从数据库中的应用程序中保留所有这些共享对象,如果已共享,我不想共享同一对象
考虑到我将在不同的服务器上部署应用程序,可能会出现两个实例都试图向表中插入相同对象的情况
如何通过完全阻塞应用程序来管理此并发问题?我的意思是两个线程将尝试插入相同的对象,它们必须同步,但它们不应该阻止第三个线程插入完全不同的对象 若有一种方法可以从数据本身派生出数据项的主键,那个么数据库将自行解决此类并发问题——第二次插入将因“主键约束冲突”而失
在我的GUI中,我有一个TableView,在一个名为PathGetter的类将加载的文件加载到ObservableArrayList中之后,它应该显示一个加载文件的列表,但我无法正确地实现该任务
这是JavaFX类中的重要部分
browseButton.setOnAction(event -> {
File dir = folderPicker.showDialog(bwindow);
if(dir != null){
我不太了解openGL,但我有一个在主UI线程中创建的上下文:
eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglCreateWindowSurface(..)
eglCreateContext(..)
eglMakeCurrent(...)
但现在我还想在背景线程中进行一些图形操作(主要是创建纹理,然后将这些纹理发送到主ui线程中进行绘制)。但是我不知道如何在第二个线程中初始化第二个上下文(或者如何在第二个线程中使用第一个上下文):(也许我必须在第二个线程中使用e
我在做smth,比如:
Iterator<String> iterator = requestList.iterator()
(1..threadCount).each {
Thread.start {
while(iterator.hasNext()) {
log.info iterator.next()
Thread.sleep(50)
}
我有一个使用多线程的基本程序。调用线程过程时,每个线程需要使用不同的随机数。我曾尝试在线程过程中设置随机数生成器的种子,但每个线程的随机数都相同。以下是我正在做的一个简单版本:
public ref class ThreadX
{
public:
void ThreadProc()
{
srand(time(NULL));
Console::WriteLine(rand()); //Will output same random numbers
所以我正在尝试创建一个非常大的扫雷游戏,我将把整个地图存储在一个容器中,可能是一个2D数组。在“扫雷舰”中,当你展示一块空白的地砖时,所有8块相邻的地砖都会被展示,如果其中一块是空白的地砖,那么它的相邻地砖就会被展示,所以整个过程是递归的
对于一个非常大的映射,这很容易升级,以至于整个算法需要很长时间才能完成。我想使用线程来并行显示图块,但是如果所有线程都访问同一个图,那么我必须使用锁。几乎每个线程都会坐在那里等待轮到它们访问地图,而我真的希望它并行完成
我的问题是,如何处理访问图形的多线程算法
我花了很长时间试图弄明白如何在英特尔iFortran编译器v 16编译的Fortran代码上并行处理一个简单的点积计算。我有下面的代码部分,它是用于更复杂过程的程序的一部分,但这是程序花费大部分时间的地方:
double precision function ddot(n,dx,incx,dy,incy)
c
c forms the dot product of two vectors.
c uses unrolled loops for increments equal to
Spring4D的日志机制是线程安全的吗?(我想单位是Spring.Logging.*)
例如,多个线程能否从以下容器解析并使用ILogger的实现
uses
System.SysUtils,
Spring.Container,
Spring.Logging,
Spring.Logging.Appenders,
Spring.Logging.Controller,
Spring.Logging.Loggers;
var
Container: TContainer;
如果当前内核正在调度60个线程,则它们属于3个进程:
A:10根线
B:20根线
C:30线
他们都在做计算(没有磁盘IO)
C会比B做得更多,B会比A做得更多吗
这对我来说似乎不太公平。如果我是一个不负责任的程序员,我可以产生更多的线程来消耗更多的CPU资源
这与golang的关系:
在go中,go调度程序通常有一个由#个CPU核心线程组成的线程池。如果一个有更多线程的进程完成了更多的工作,那么这为什么有意义呢
这对我来说似乎不太公平。如果我是一个不负责任的程序员,
我可以产生更多的线程来消耗
Python 3.6
我正在写一个脚本来自动检查,以确保网站上的所有链接都能正常工作
我有一个版本,但它运行缓慢,因为python解释器一次只运行一个请求。我导入selenium以在列表中下拉链接。我从41000个链接开始。我摆脱了重复,现在我的列表中的链接减少到7300个。我使用请求模块只是检查响应代码。我知道多重处理就是答案,只要看看一堆不同的方法。哪一个最适合我的需要?我需要记住的唯一一件事是,我不能同时运行多个线程,因此我不会在服务器上发送带有请求的Web服务器线程。提前谢谢。这是我第一
如果我有一个60秒的加密视频线程
我可以加密1000个视频吗
1000次
60年代?如果是,为什么/如何
这是一次技术采访。答案似乎是肯定的,但我说不出原因
如果您运行1000个线程,那么CPU处理/功耗不是全部分配到1000个线程中吗?所以我的答案是否定的
帮助?答案只取决于您计算机上的内核数量。如果你有1000个,你可以。答案只取决于你计算机上的内核数量。如果你有1000个,是的,你可以。在我看来,对面试官来说,这是一个有点愚蠢的问题
如果我们假设加密的唯一资源瓶颈是cpu(不现实-考虑io
在运行测试CNN时,当尝试使用sess.close()关闭会话或请求toe coordinator停止并收集线程时,我总是会遇到此错误。显然,会话正在试图关闭,而线程仍在运行。我就是找不到办法阻止这种事情发生。或者如果有更好/正确的方法在tensor flow中使用队列和线程
提前谢谢
总有一堆:
2017-10-24 15:48:02.625448: W C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\36\tensorflow\co
我有一些非常简单的代码,应该通过同时启动10个线程来测试多线程记录器,这些线程将同时写入记录器
我希望看到所有10条消息,而不是以任何顺序;然而,我随机得到5、6、7、8、9条,有时还有10条输出消息
代码如下:
//*.cxx
#include <iostream>
#include <mutex>
#include <shared_mutex> // requires c++14
#include <string>
#include <t
我读过这本书
它声明我可以从多个线程调用ID3D11Device(除非使用了D3D11_CREATE_DEVICE_SINGLETHREADED),但是对ID3D11DeviceContext的调用必须包含一个关键部分
我还没有找到任何关于使用“释放”方法释放资源的信息,这些资源包括纹理、渲染目标、顶点/索引缓冲区、着色器
ID3D11Texture2D、ID3D11Texture3D、ID3D11ShaderResourceView、ID3D11RenderTargetView、ID3D11D
似乎应该有一种方法来分别监视每个线程。其他JetBrains产品中有一个称为并行堆栈的功能似乎可以解决这个问题。但我在CLion 2018.2.5中没有看到这一点
理想情况下,当其他线程在后台运行时,可以强制IDE保持并逐步通过一个线程。如果在另一个线程中遇到断点,则会出现一个单独的调用堆栈,指示断点已停止,但源代码显示将停留在被监视的线程上
是否有某种方法可以实现类似的效果,或者有另一种方案可以高效地调试多线程应用程序?在CLion中使用lldb调试使用MSVC构建的应用程序时,我遇到了同样的
例如,我有一台单核机器。我的程序需要扫描一个网站,并寻找新的文件。每当它发现一个新文件,它就会下载该文件并上传到其他地方
现在我有两个选择来实施我的计划:
选项1:创建一个用于扫描网站的线程。此线程将计划每秒运行一次。每当它发现一个新文件时,就会产生一个新的线程来下载并上传该文件。(例如,如果扫描5个新文件,将产生5个线程+1个原始扫描线程)
选项2:只需创建两个线程,一个用于扫描,另一个用于下载和上传。其他文件将放入队列
哪个选项更有意义?在我看来,我认为选项2更有意义,因为online 1线
只是想让你真正了解我-我在这里试图学习的是工具的功能,而不是其他。不是它通常用来做什么,不是惯例所说的,只是钝器工具所做的。在本例中-条件变量的作用
到目前为止,在我看来,这是一种简单的机制,允许线程等待(阻塞),直到其他线程发出信号(解除阻塞)。除此之外,无需处理关键部分访问或数据访问(当然,它们可以用于此,但这只是程序员的选择问题)。此外,信号通常仅在发生重要事件(如加载数据)时才发出,但理论上可以随时调用。到目前为止正确吗
现在,我看到的每个示例都使用一个条件变量对象(例如std::con
我有一个结构,它的字段是Sendertype
pub-struct-GenericConnectionPool
哪里
E:连接连接器,
{
_发送者:发送者,
_接受者:Arc,
_实时连接的数量:AtomicU8,
_最大连接数:u8,
_最小连接数:u8,
_连接:Arc,
_连接器:E,
}
我在多个线程中使用这个结构,这就是为什么在Arc内部使用它并克隆它
let pool=Arc::new(GenericConnectionPool::new(2,1,cc));
普林顿!(“此处”)
我想从macOS上的parallel命令的所有潜力中获益(似乎有两个版本,GNU和Ole Tange的版本,但我不确定)
使用以下命令:
parallel -j8 find {} ::: *
如果我位于一个包含8个子目录的目录中,我将有一个很大的性能。
但是如果所有这些子目录都有一个小的内容,除了一个之外,我将只有一个线程在唯一的“大”目录上工作
有没有一种方法可以遵循这个“大目录”的并行化?我的意思是,剩下的唯一线程能得到其他线程的帮助吗
理想的情况是,当通过上面命令行中的find命令找到
我在读操作系统方面的恐龙书,我对多线程模型有疑问
第1行:在内核之上支持用户线程,并且在没有内核支持的情况下管理用户线程
第2行:多对一模型将多个用户级线程映射到一个内核线程
我的问题是,映射用户级线程和内核级线程需要什么?我不完全理解你的问题。在x86 CPU上运行的现代操作系统中,没有真正的内核线程。操作系统大多是中断驱动的
例如,在Linux上有systemd,它作为内核的第一个进程运行。然后systemd查看其“单元”,这些单元是允许指定下一步运行的配置文件。它负责向您展示著名的用户G
在Dymola2020x中使用多核功能是否总能加快解决方案的速度?我的观察结果是使用Advanced.ParallelizeCode=true,用于DOF~23k的模型;编译时间与单线程相当,但是使用默认解算器的解算时间较慢
任何意见都将不胜感激 单个模型的多核功能并不总是能够加快执行速度
有许多可能的解释:
依赖关系太多,根本不可能并行化。(查看翻译日志-这相当清楚)
只能并行化模型的一小部分。(查看翻译日志-这需要更多时间)
该模型使用许多外部功能(或FMU),默认情况下,Dymola将其
我在主线程中创建了两个WndProc,然后几乎同时从其他线程向每个线程发布消息,但从WndProc1开始。这个WNDPOC1有一个任务要做,它会持续一段时间。。。它在开始和结束时都会发出信号。WNDPOC2在被访问时也会发出信号。现在,当我按下按钮开始这个测试时,我得到:“P1进入…[延迟]…P1离开WndProc2”。如您所见,第二条消息等待WNDPOC1完成,尽管他被发送到WNDPOC2!我想知道的是,如果这两个WNDPOC没有任何共同点,这个序列化是如何工作的?我认为,即使我有两个不同的组
正在尝试在YAML文件中转储包含共享引用的嵌套哈希映射。Perl代码在这里。散列实际上是线程友好的
use v5.18;
use YAML::XS;
use threads;
use threads::shared;
use Data::Dumper;
my $href1 = shared_clone({
anotherRef => shared_clone({})
});
$href1->{anotherRef}{test} = &share({});
pr
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 324 页