我有一个包含一些表的数据库.我想使用多个线程更新表.我将在所有线程中使用相同的SQLiteDatabase实例.
请建议这种方法是否正确.Sqlite数据库线程安全吗?两个不同的线程可以同时为不同的值集更新同一个表.
我正在寻找正确的方法/结构来创建一个循环Thread/Task...
原因是,我需要每15秒检查一次数据库以获取报告请求.
这是我到目前为止所尝试的,但我得到OutOfMemoryException:
private void ViewBase_Loaded(object sender, RoutedEventArgs e)
{
//On my main view loaded start thread to check report requests.
Task.Factory.StartNew(() => CreateAndStartReportRequestTask());
}
private void CreateAndStartReportRequestTask()
{
bool noRequest = false;
do
{
//Starting thread to Check Report Requests And Generate Reports
//Also need the ability to Wait/Sleep when there are noRequest.
reportRequestTask = Task.Factory.StartNew(() => noRequest = CheckReportRequestsAndGenerateReports());
if (noRequest)
{
//Sleep 15sec
reportRequestTask.Wait(15000);
reportRequestTask = null;
}
else
{
if (reportRequestTask.IsCompleted)
{ …Run Code Online (Sandbox Code Playgroud) 使用TempfileRuby时,正在创建一个具有线程安全和进程间安全名称的文件.我只需要这样的文件名.
我想知道是否有比以往更直接的方法:
t = Tempfile.new(['fleischwurst', '.png'])
temp_path = t.path
t.close
t.unlink
Run Code Online (Sandbox Code Playgroud) 基本上我想要像Dictionary <Tkey1,TKey2,TValue>这样的东西,但不是(正如我在其他问题中看到过的那样)和AND中的键,但是在OR中.为了更好地解释:我希望能够在字典中找到只提供其中一个键的元素,而不是两者.
我还认为我们应该考虑线程安全性以及轻松扩展到Dictionary <Tkey1,TKey2,TKeyN,TValue>解决方案的能力......
我试图简单地测试JLS保证的最终字段的初始化安全性.这是我写的一篇论文.但是,根据我当前的代码,我无法让它"失败".有人可以告诉我我做错了什么,或者这只是我必须反复运行然后看到一个不幸的时机失败?
这是我的代码:
public class TestClass {
final int x;
int y;
static TestClass f;
public TestClass() {
x = 3;
y = 4;
}
static void writer() {
TestClass.f = new TestClass();
}
static void reader() {
if (TestClass.f != null) {
int i = TestClass.f.x; // guaranteed to see 3
int j = TestClass.f.y; // could see 0
System.out.println("i = " + i);
System.out.println("j = " + j);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的线程正在调用它:
public class TestClient {
public static void …Run Code Online (Sandbox Code Playgroud) 考虑在x86 CPU上进行单个内存访问(单个读取或单个写入,而不是读取或写入)SSE指令.该指令访问16字节(128位)的存储器,访问的存储器位置对齐为16字节.
文档"英特尔®64架构内存订购白皮书"指出,对于"读取或写入地址在8字节边界上对齐的四字(8字节)的指令",内存操作似乎作为单个内存访问执行,而不管记忆类型.
问题:是否存在Intel/AMD/etc x86 CPU,它们保证读取或写入与16字节边界对齐的16字节(128位)作为单个内存访问执行?是这样,它是哪种特定类型的CPU(Core2/Atom/K8/Phenom/...)?如果您对此问题提供答案(是/否),请同时指定用于确定答案的方法 - PDF文档查找,强力测试,数学证明或您用于确定答案的任何其他方法.
此问题涉及http://research.swtch.com/2010/02/off-to-races.html等问题
更新:
我在C中创建了一个可以在您的计算机上运行的简单测试程序.请在您的Phenom,Athlon,Bobcat,Core2,Atom,Sandy Bridge或您碰巧拥有的任何支持SSE2的CPU上编译并运行它.谢谢.
// Compile with:
// gcc -o a a.c -pthread -msse2 -std=c99 -Wall -O2
//
// Make sure you have at least two physical CPU cores or hyper-threading.
#include <pthread.h>
#include <emmintrin.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
typedef int v4si __attribute__ ((vector_size (16)));
volatile v4si x;
unsigned n1[16] __attribute__((aligned(64)));
unsigned n2[16] __attribute__((aligned(64)));
void* thread1(void *arg) {
for (int i=0; i<100*1000*1000; i++) { …Run Code Online (Sandbox Code Playgroud) MSDN文档的常规"线程安全"部分,用于StringBuilder说明:
...任何实例成员都不保证是线程安全的......
但是这个陈述感觉它已被复制并粘贴到框架中的几乎每个类:
http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx
但是,Gavin Pugh的这些博客文章提到了以下的线程安全行为StringBuilder:
http://www.gavpugh.com/2010/03/23/xnac-stringbuilder-to-string-with-no-garbage/
http://www.gavpugh.com/2010/04/01/xnac-avoiding-garbage-when-working-with-stringbuilder/
此外,Reflector揭示的StringBuilder的源代码以及SSCLI源代码中的相应注释也提出了许多实现注意事项以确保线程安全性:
有没有人更深入地了解一个StringBuilder实例是否可以安全地在多个并发线程之间共享?
想象一下IDisposable接口的实现 ,它有一些公共方法.
如果在多个线程之间共享该类型的实例并且其中一个线程可以处置它,那么确保其他线程在处置后不尝试使用该实例的最佳方法是什么?在大多数情况下,在处理对象之后,其方法必须知道它并抛出ObjectDisposedException或者InvalidOperationException或者至少通知调用代码做错事.我是否需要为每种方法进行同步- 尤其是在检查它是否被丢弃时?IDisposable使用其他公共方法的所有实现都需要是线程安全的吗?
这是一个例子:
public class DummyDisposable : IDisposable
{
private bool _disposed = false;
public void Dispose()
{
_disposed = true;
// actual dispose logic
}
public void DoSomething()
{
// maybe synchronize around the if block?
if (_disposed)
{
throw new ObjectDisposedException("The current instance has been disposed!");
}
// DoSomething logic
}
public void DoSomethingElse()
{
// Same sync logic as in DoSomething() again?
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个javafx应用程序,以及一个工作线程,通过javafx.concurrent.Task执行,执行一个漫长的过程,即压缩和上传一组文件.
我已将任务进度连接到进度条progressProperty.
除此之外,我想要一个关于正在处理的项目的详细状态,以报告给ui.也就是说,正在处理的文件的名称及其大小以及单个文件进程可能产生的任何错误.
使用这些信息更新UI无法从工作线程完成,最多可以将其添加到同步集合中.
但后来我需要一些事件来通知UI新数据可用.
javafx是否对此问题有一些特定的支持?
我没有将特设的跨线程机制设计为Platform.runLater,而是试图允许从其他线程中侦听每个属性.就像Task提供的runningProperty和stateProperty一样
Handler,Runnable和Threads有什么区别?
当我使用android时,我需要在后台运行一些东西.我使用Threads来运行它.通常我会编写一个扩展Thread的类并实现run方法.
我还看到了一些示例,其中implments可运行并传递给可运行到Threads中.
不过我还是很困惑.有人能给我一个明确的解释吗?
thread-safety ×10
.net ×3
c# ×3
java ×3
android ×2
atomic ×1
collections ×1
concurrency ×1
dictionary ×1
filenames ×1
final ×1
generics ×1
idisposable ×1
javafx-2 ×1
jls ×1
locking ×1
multitasking ×1
ruby ×1
sqlite ×1
sse ×1
temp ×1
x86 ×1