假设父和子都使用一个管道进行写入和读取意味着当一个写入时只有其他读取,否则它会阻塞.有什么办法吗?我尝试使用睡眠功能,但由于竞争条件,它没有给出正确的输出.这是我的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define MSGSIZE 16
main ()
{
int i;
char *msg = "How are you?";
char inbuff[MSGSIZE];
int p[2];
pid_t ret;
pipe (p);
ret = fork ();
if (ret > 0)
{
i = 0;
while (i < 10)
{
write (p[1], msg, MSGSIZE);
sleep (2);
read (p[0], inbuff, MSGSIZE);
printf ("Parent: %s\n", inbuff);
i++;
}
exit(1);
}
else
{
i = 0;
while (i < 10)
{
sleep (1); …Run Code Online (Sandbox Code Playgroud) 我正在使用Delphi 2006,并且我正在开发的应用程序有点问题.
我有一个表单创建一个线程,调用一个执行冗长操作的函数,让我们称之为LengthyProcess.在LengthyProcess函数内部,我们还调用了几个Dll函数,这些函数也创建了自己的线程.
我遇到的问题是,如果我不使用我的线程的Synchronize函数调用LengthyProcess线程停止响应(主线程仍然响应正常).我不想使用Synchronize,因为这意味着主线程正在等待LengthyProcess完成,因此无法创建单独的线程.
我已经将问题跟踪到了创建线程然后调用WaitFor的dll中的函数,顺便说一下,这都是使用TThread完成的.WaitFor检查CurrentThreadID是否等于MainThreadID,如果是,那么它将调用CheckSychronization,一切正常.因此,如果我们使用Synchronize,那么CurrentThreadID将等于MainThreadID,但是如果我们不使用Synchronize当然是CurrentThreadID <> MainThreadID,并且当发生这种情况时WaitFor会告诉当前线程(我创建的线程)等待由此创建的线程DLL等所以CheckSynchronization永远不会被调用,我的线程最终会等待dll中创建的线程.
我希望这是有道理的,抱歉,我不知道有什么更好的解释方法.有没有其他人有这个问题,知道如何解决它吗?
我正在阅读最初来自(我相信)IBM developerworks站点的线程教程.在其中,他们讨论了synchronized关键字以及同步代码块如何被实际对象锁定,而不是代码块本身.
例如,在下面的代码中,作者声明即使静态类Thingie的setLastAccess方法被列为同步,下面定义的两个线程也可以setLastAccess同时调用,因为它们使用的是不同的值.但是,如果thingie是静态的,那不就意味着它们使用相同的值吗?
是否只是变量名称需要不同,即使它们指的是同一个对象?
public class SyncExample {
public static class Thingie {
private Date lastAccess;
public synchronized void setLastAccess(Date date) {
this.lastAccess = date;
}
}
public static class MyThread extends Thread {
private Thingie thingie;
public MyThread(Thingie thingie) {
this.thingie = thingie;
}
public void run() {
thingie.setLastAccess(new Date());
}
}
public static void main() {
Thingie thingie1 = new Thingie(),
thingie2 = new Thingie();
new MyThread(thingie1).start();
new MyThread(thingie2).start();
}
}
Run Code Online (Sandbox Code Playgroud) 如果我设置了一个NSUserDefault对象并尝试在同步之前访问它,我是否可以访问刚刚添加的对象?
我已经尝试编写代码来测试它,但我不确定在没有我知道的情况下同步是否正在发生.
根据我的理解,非静态方法的同步将在对象级别被阻止,并且静态方法上的同步将在类实例级别被阻止.
基于此,请在下面找到我对各种场景的理解:
非静态同步方法访问然后其他非静态同步方法也阻塞
非静态同步方法访问然后非静态非同步方法不阻塞.
static synchrnize方法访问然后阻止该类实例的其他同步(静态和非静态)方法.
静态同步方法访问然后其他非静态非同步方法不会阻塞.
静态同步方法访问然后其他静态非同步方法不阻止.
静态同步方法访问然后阻止所有对象实例的非静态同步方法.
非静态synchrnize方法访问然后静态同步方法不阻塞
请帮我核实一下.
我需要记录一些数据,并且最好使用线程复制文件,但是使用下面的代码,但它只是冻结我的应用程序.
如果我正确理解整个XE7 Parallell库TThread.Queue并且TThread.Synchronize应该与主线程同步,但在我的情况下整个应用程序冻结.
我究竟做错了什么?
procedure TCopyDeviceContent.StartCopy;
var
OK: boolean;
begin
OK := false;
// showmessage('fFiles.Count = '+inttostr(fFiles.Count));
if fFiles.Count = 0 then
begin
NotifyDone;
exit;
end;
TParallel.For(0, fFiles.Count-1,
procedure (Value: Integer)
begin
TThread.Queue(TThread.CurrentThread, //Here is where it freezes
procedure
begin
Log('Setting fCurrentFile to '+fFiles.Strings[value]);
end
);
sleep(1000);
fCurrentFile := fFiles.Strings[value];
Log('Triggering fOnBeforeProcess');
if assigned(fOnBeforeProcess) then fOnBeforeProcess(self);
Log('Does file exist?');
if FileExists(fFiles.Strings[value]) = true then
begin
Log('Yes!');
Log('Trying to copy file to Windows temp folder.');
try
TFile.Copy(fFiles.Strings[value], …Run Code Online (Sandbox Code Playgroud) 我有一个班级商店。在 main 中我在 main 中创建了 3 个商店对象
Thread thread1 = new Thread(shop1);
Thread thread2 = new Thread(shop2);
Thread thread3 = new Thread(shop3);
threads.add(thread1);
threads.add(thread2);
threads.add(thread3);
for (Thread t : threads) {
t.start();
}
Run Code Online (Sandbox Code Playgroud)
商店类中的 run 方法
@Override
public void run() {
for(int day=0;day<=360;++day) {
if (day% 30 == 0) {
delivery();
}
CODE...
}
}
Run Code Online (Sandbox Code Playgroud)
我希望线程每 30 天同步一次。所以每 30 天线程就会互相等待。
使用 Thread.join() 是最简单的,但是当我在 run() 中时如何使用它。
我也在考虑做而不是360天,12次30天
public void run() {
for(int day=0;day<30;++day) {
if (day% 30 == 0) {
delivery(); …Run Code Online (Sandbox Code Playgroud)