我有三个AJAX请求一个接一个地触发,我希望能够同时回显所有数据.
$.ajax ({
type: "POST",
url: "page1.php",
data: "var1=" + var1,
success: function(msg) {
$("#results2").load("page2.php",
function (responseText, textStatus, XMLHttpRequest) {
$("#results3").load("page3.php",
function (responseText, textStatus, XMLHttpRequest) {
if (textStatus == "success") {
$("#results1").html(msg);
}
});
});
}
});
Run Code Online (Sandbox Code Playgroud)
#results1,#results2并且#results3所有人都需要同时加载他们的相关数据.上面的代码没有这样做.
我想在这里证实,如果我理解正确的是如何TCriticalSection和Synchronize操作.
据我所知,现在Synchronize使用SendMessage(更新:或者至少在下面几条评论中提到的较旧的VCL版本中使用它),它暂停当前正在执行的线程(以及任何其他线程),不像那样PostMessage,然后执行所需功能(来自主线程).在SendMessage执行时"停止"多线程.
但我不确定TCriticalSection.比方说我创建这样的东西:
// Global variables somewhere in my code any thread can access
boost::scoped_ptr<TCriticalSection> ProtectMyVarAndCallFnction(new TCriticalSection);
int MyVariable1;
void CallMyFunctionThatAlsoModifiesMoreStuff() { /* do even more here */ };
// Thread code within one of the threads
try {
ProtectMyVarAndCallFnction->Acquire();
MyVariable1++;
CallMyFunctionThatAlsoModifiesMoreStuff();
}
__finally {
ProtectMyVarAndCallFnction->Release();
}
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是 - 关键部分如何"知道"我在这种情况下保护MyVariable1以及被调用的函数可以修改什么?
如果我理解正确 - 它没有 - 并且我有责任在任何线程中正确调用Acquire()想要更改MyVariable1或调用此函数(或执行任何两个).换句话说,我认为TCriticalSection是用户定义的块,它定义了我分配给它的逻辑.它可以是一组变量或任何特定函数,只要我在可能写入此块或使用此函数的所有线程中调用Acquire().例如,"DiskOp"可能是我TCriticalSection在磁盘上写入的名称,"Internet"可能是TCriticalSection调用从Internet检索某些数据的函数的名称.我弄错了吗?
此外,在这种情况下,TCriticalSection是否总是需要成为一种全局变量?
delphi multithreading c++builder critical-section synchronize
想要在两个服务器之间同步缓存数据.两个数据库共享同一个数据库,但为了更好的执行数据,我在启动时将数据缓存到Hash Map中.因此,希望在不重新启动服务器的情况下同步缓存的数据.(两台服务器同时启动).
请建议我最好和最有效的方法.
我有一个问题,我需要x线程等到它们都达到同步点.我的解决方案使用synchronise下面的方法,当需要同步时,每个线程函数调用该方法.
有一个更好的方法吗?
thread_count = 0
semaphore = threading.Semaphore()
event = threading.Event()
def synchronise(count):
""" All calls to this method will block until the last (count) call is made """
with semaphore:
thread_count += 1
if thread_count == count:
event.set()
event.wait()
def threaded_function():
# Do something
# Block until 4 threads have reached this point
synchronise(4)
# Continue doing something else
Run Code Online (Sandbox Code Playgroud) 我在Delphi中编写了一个dll库,它创建了多个线程.让我一步一步地描述问题.我很抱歉提前做了很长时间的描述:-(.
让我们暂时忘掉图书馆.我创建了一个Windows应用程序,它将从几个摄像头呈现视图.我创建了一个窗口,用于显示来自单个摄像头的视图,它包含一个TImage控件.有一个线程(一个TThread后代)每隔几毫秒从摄像头下载当前图像,并将其分配给该窗口的TImage控件(使用Synchronize()方法).应用程序在启动时创建该窗口的多个实例(每个窗口都有一个单独的线程),因此您可以同时从多个摄像头中查看实时视图.更重要的是,所有这些查看窗口都是主应用程序窗口的父级,因此它们出现在其中.
一切正常,直到我决定将这两个窗口放入dll库.我发现有必要出于某些原因,但现在它们并不重要.所以我创建了一个新的dll库,将现有的主窗口和摄像机视图窗口添加到项目中,并导出了一个创建并返回主窗口实例的函数.创建主窗口时,它会创建几个摄像机视图窗口,使其自身成为父窗口.
然后,出于测试目的,我创建了一个应用程序,它从库中导入上面提到的dll函数,并在启动时调用它来获取主窗口的实例; 然后只是在屏幕上显示它(处于非模态状态).
当我启动应用程序时,我发现我无法从任何相机获得单个图像.当我调试它时,我注意到当线程调用Synchronize()方法时,它会永远挂起.在将这两个窗口放入dll之前没有发生过.
这是我的问题.说实话,这是我对图书馆的第一种方法,到目前为止,我必须解决许多其他问题.您可能想知道为什么我使用Windows而不是框架......所以每当我在dll中创建一个TFrame实例时,我会得到一个例外,说"控件xxx没有父窗口".我不知道该怎么办,所以我改用了windows :-(.
你能告诉我如何处理同步问题吗?当应用程序启动时,主线程似乎没有以任何方式被阻止它接受点击按钮等.那么问题是什么?
请帮忙!
先感谢您!!
我是PHP的新手,所以要开始我已经决定实现一个单例.
虽然我能够在php中重新创建单例模式,但我不确定如何实现双重检查锁定.
这在PHP中是否可行/需要.我在某处读过PHP不是多线程的?有人可以证实吗?
如果它是多线程的,有人可以向我解释一下lock()或synchronize()在PHP中是如何工作的吗?
谢谢,亨利
php singleton multithreading synchronize double-checked-locking
但我正在同步"名册"对象,无论它到处都是新的.怎么会 ?
违规代码:
public Roster getRoster() {
if (roster == null) {
return null;
}
if (!roster.rosterInitialized) {
try {
synchronized (roster) {
roster.reload();
long waitTime = SmackConfiguration.getPacketReplyTimeout();
long start = System.currentTimeMillis();
while (!roster.rosterInitialized) {
if (waitTime <= 0) {
break;
}
roster.wait(waitTime);
long now = System.currentTimeMillis();
waitTime -= now - start;
start = now;
}
}
}
catch (InterruptedException ie) {
// Ignore.
}
}
return roster;
}
Run Code Online (Sandbox Code Playgroud) 说,我有一个数据对象:
class ValueRef { double value; }
每个数据对象存储在主集合中的位置:
Collection<ValueRef> masterList = ...;
我还有一组作业,其中每个作业都有一个本地的数据对象集合(每个数据对象也出现在其中masterList):
class Job implements Runnable {
Collection<ValueRef> neededValues = ...;
void run() {
double sum = 0;
for (ValueRef x: neededValues) sum += x;
System.out.println(sum);
}
}
Run Code Online (Sandbox Code Playgroud)
用例:
for (ValueRef x: masterList) { x.value = Math.random(); }
使用某些作业填充作业队列.
唤醒线程池
等到每个工作都被评估
注意:在作业评估期间,所有值都是常量.但是,线程可能已经评估过去的作业,并保留缓存的值.
问题: 确保每个线程看到最新值所需的最小同步量是多少?
我理解从monitor/lock-perspective进行同步,我不理解从cache/flush-perspective进行同步(即,在同步块的进入/退出时内存模型保证了什么).
对我来说,感觉我需要在更新值的线程中同步一次以将新值提交到主内存,并且每个工作线程一次,以刷新缓存以便读取新值.但我不确定如何最好地做到这一点.
我的方法:创建一个全局监视器:static Object guard = new Object(); 然后,同步guard,同时更新主列表.最后,在启动线程池之前,对池中的每个线程执行一次,guard在空块中进行同步.
这真的会导致该线程读取的任何值的完全刷新吗?或者只是在同步块内触及的值?在这种情况下,可能我应该在循环中读取每个值一次,而不是空块?
谢谢你的时间.
编辑:我认为我的问题可归结为,一旦我退出同步块,每次第一次读取(在该点之后)都会进入主存储器吗?无论我同步什么?
我知道a Hashtable是同步的,但为什么它的get()方法是同步的?
它只是一种读取方法吗?
我有下一个情况.我在不同的服务器上有两个mongodb实例.例如
Mongodb instance on server "one" (host1:27017) with database: "test1"
Mongodb instance on server "two" (host2:27017) with database: "test2"
Run Code Online (Sandbox Code Playgroud)
现在,我需要将"host1:27017"中的"test1"数据库与"host2:27017"中的"test2"同步.
通过"同步"我的意思是下一个:
如果"test2"中的某些集合不存在于"test2"中,那么该集合应该在"test1"数据库中完全复制.
如果"test2"数据库中不存在某些来自集合的记录,则必须添加否则更新.如果"test1"数据库中的A集合中不存在记录,但存在于"test2"数据库中的A集合中,则必须从"test2"中删除记录.
顺便说一下这里是个问题.例如:"test1"数据库的集合"A"包含以下文档:
{
_id: "1",
name: "some name"
}
Run Code Online (Sandbox Code Playgroud)
"test2"数据库的集合"A"包含以下文档:
{
_id: "1",
name: "some name"
}
{
_id: "2",
name: "some name2"
}
Run Code Online (Sandbox Code Playgroud)
如果我执行db.copyDatabase('test1','test2',"host2:27017"),我会收到错误:
"errmsg":"例外:E11000重复键错误索引:test1.A.$ id dup key:{:\"1 \"}"
与cloneDatabase命令相同.我怎么解决它?
一般来说,同步数据库的方法有哪些?我知道最简单的方法是将文件从一台服务器复制到第二台,但也许有更好的方法.
请帮忙.我是mongo的新人.谢谢.