Tag: 并发

Java中的易变variables

所以我正在阅读这本题为“ 实践中的Java并发”的书,我被困在这样一个我不能理解的例子中。 这是引用: 当线程A写入一个易失性variables,然后线程B读取同一个variables时,写入易失性variables之前A对A可见的所有variables的值在读取volatilevariables后对B变得可见。 有人能给我一个反例,说明为什么“在写入易失variables之前A对A可见的所有variables的值在B读完易失variables后变为可见”? 我很困惑,为什么在读取volatilevariables之前,所有其他的非易失性variables都不能被B看到?

.NETasynchronousstream读/写

我一直在试图解决这个“并行编程”考试练习(在C#中): 知道Stream类包含int Read(byte[] buffer, int offset, int size)和void Write(byte[] buffer, int offset, int size)方法,在C#中实现NetToFile方法,将所有从NetworkStream net实例添加到FileStream file实例。 要执行传输,请使用asynchronous读取和同步写入,避免在读取操作期间阻塞一个线程。 当net读取操作返回值0时,传输结束。为简化操作,不需要支持受控的取消操作。 void NetToFile(NetworkStream net, FileStream file); 我一直在试图解决这个问题,但是我正在努力解决与问题本身有关的问题。 但首先,这是我的代码: public static void NetToFile(NetworkStream net, FileStream file) { byte[] buffer = new byte[4096]; // buffer with 4 kB dimension int offset = 0; // read/write offset int nBytesRead = 0; […]

这是Go的一个惯用的工作线程池吗?

我试图用goroutines写一个简单的工作池。 我写的地道代码是惯用的吗? 如果不是,那么应该改变什么? 我希望能够将工作线程的最大数量设置为5,并且阻止,直到一个工作人员变得可用,如果5个人都忙的话。 我怎样才能把这个扩展到最多只有5名工人? 我是否产生了静态的5个work_channel ,并给每个work_channel ? 码: package main import ( "fmt" "math/rand" "sync" "time" ) func worker(id string, work string, o chan string, wg *sync.WaitGroup) { defer wg.Done() sleepMs := rand.Intn(1000) fmt.Printf("worker '%s' received: '%s', sleep %dms\n", id, work, sleepMs) time.Sleep(time.Duration(sleepMs) * time.Millisecond) o <- work + fmt.Sprintf("-%dms", sleepMs) } func main() […]

哪个更好的node.js并发任务? 纤维? networking工作人员? 或线程?

我前段时间偶然发现了node.js,喜欢它。 但很快我发现它缺乏执行CPU密集型任务的能力。 所以,我开始使用Google,并得到这些答案来解决这个问题:纤维,networking工作者和线程(thread-a-gogo)。 现在哪一个使用是一个混乱,其中一个肯定需要使用 – 毕竟有一个服务器,只是在IO好,没有别的目的是什么? 需要build议! 更新: 我正在想办法, 只是需要build议。 现在,我想到的是:让我们有一些线程(使用thread_a_gogo或者webworkers)。 现在,当我们需要更多的时候,我们可以创造更多。 但是创作过程会有一些限制。 (不是由系统暗示,但可能是因为开销)。 现在,当我们超出限制时,我们可以分叉一个新的节点,并开始创build线程。 这样,它可以继续下去,直到我们达到一定的限度(毕竟,进程也有一个很大的开销)。 当达到这个限制时,我们开始排队任务。 每当一个线程变为空闲时,它将被分配一个新的任务。 这样,它可以顺利进行。 所以,那是我想到的。 这个想法好吗? 我对这个过程和线程有点新鲜,所以没有任何专业知识。 请分享你的意见。 谢谢。 🙂

SSE指令:哪个CPU可以做primefaces16B内存操作?

考虑x86 CPU上的单个内存访问(单次读取或单次写入,而不是读取+写入)SSE指令。 该指令访问16个字节(128位)的内存,访问的内存位置alignment到16个字节。 文档“英特尔®64架构内存订购白皮书”指出,对于“读取或写入地址在8字节边界上alignment的四字(8字节)的指令”,内存操作似乎作为单个内存访问执行,而不pipe内存types。 问题: 是否存在保证读取或写入16字节边界的16字节(128位)作为单个存储器访问的Intel / AMD / x86 x86 CPU? 是这样的,哪种types的CPU是它(Core2 / Atom / K8 / Phenom / …)? 如果您对这个问题提供了答案(是/否), 还请指定用于确定答案的方法 – PDF文档查找,powershelltesting,mathcertificate或您用来确定答案的任何其他方法。 这个问题涉及到诸如http://research.swtch.com/2010/02/off-to-races.html之类的问题 更新: 我用C语言创build了一个简单的testing程序,你可以在你的电脑上运行。 请在您的Phenom,Athlon,Bobcat,Core2,Atom,Sandy Bridge或任何具有SSE2function的CPU上进行编译和运行。 谢谢。 // Compile with: // gcc -oa ac -pthread -msse2 -std=c99 -Wall -O2 // // Make sure you have at least two physical CPU cores […]

并行stream,收集器和线程安全

请参阅下面的简单示例,其中列出了每个单词的出现次数: Stream<String> words = Stream.of("a", "b", "a", "c"); Map<String, Integer> wordsCount = words.collect(toMap(s -> s, s -> 1, (i, j) -> i + j)); 最后, wordsCount是{a=2, b=1, c=1} 。 但是我的stream量非常大,我想平行工作,所以我写道: Map<String, Integer> wordsCount = words.parallel() .collect(toMap(s -> s, s -> 1, (i, j) -> i + j)); 不过,我注意到wordsCount是一个简单的HashMap所以我不知道是否需要明确要求一个并发映射来确保线程安全: Map<String, Integer> wordsCount = words.parallel() .collect(toConcurrentMap(s -> […]

primefaces更新..在Postgres中select

我正在build立一个排队机制。 有一些需要处理的数据行和一个状态标志。 我正在使用update .. returning子句来pipe理它: UPDATE stuff SET computed = 'working' WHERE id = (SELECT id from STUFF WHERE computed IS NULL LIMIT 1) RETURNING * 嵌套的select部分是否与更新相同,还是在这里有竞争条件? 如果是这样,内部select是否需要select for update ?

困惑于UPDLOCK,HOLDLOCK

在研究使用表格提示时 ,我遇到了这两个问题: 我应该使用哪些locking提示(T-SQL)? HOLDLOCK对UPDLOCK有什么影响? 两个问题的答案都表示,当使用(UPDLOCK, HOLDLOCK) ,其他进程将无法读取该表上的数据,但是我没有看到这一点。 为了testing,我创build了一个表,并启动了两个SSMS窗口。 从第一个窗口中,我使用各种表提示从表中select了一个事务。 当事务正在运行时,从第二个窗口我跑了各种语句,看看哪个会被阻塞。 testing表: CREATE TABLE [dbo].[Test]( [ID] [int] IDENTITY(1,1) NOT NULL, [Value] [nvarchar](50) NULL, CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] 从SSMS窗口1: BEGIN TRANSACTION SELECT […]

Django:如何防止数据库条目的同时修改

如果有防止两个或多个用户同时修改相同数据库条目的方法? 向执行第二次提交/保存操作的用户显示错误消息是可以接受的,但数据不应该被默默覆盖。 我认为locking条目不是一个选项,因为用户可能会使用“返回”button或简单地closures他的浏览器,永远留下锁。

使用Python多处理解决不平行的问题

如何使用多处理来解决尴尬的并行问题 ? 不解之缘的并行问题通常由三个基本部分组成: 读取input数据(从文件,数据库,TCP连接等)。 对input数据运行计算,每个计算独立于任何其他计算 。 写入计算结果(到文件,数据库,tcp连接等)。 我们可以在两个维度上并行化程序: 第2部分可以在多个核上运行,因为每个计算都是独立的; 处理顺序无关紧要。 每个部分都可以独立运行。 第1部分可以将数据放在input队列中,第2部分可以将数据从input队列中取出,并将结果放到输出队列中,第3部分可以将结果从输出队列中取出并写出。 这似乎是并发编程的一个最基本的模式,但是我仍然试图解决它,所以让我们编写一个规范的例子来说明如何使用多处理来完成 。 以下是示例问题:给定一个包含整数行作为input的CSV文件 ,计算它们的总和。 将问题分成三部分,可以并行运行: 将input文件处理成原始数据(列表/整数的迭代) 并行计算数据的总和 输出总和 下面是传统的,单进程绑定的Python程序,它解决了这三个任务: #!/usr/bin/env python # -*- coding: UTF-8 -*- # basicsums.py """A program that reads integer values from a CSV file and writes out their sums to another CSV file. """ import csv import optparse import […]