两个线程同时调用open()可以吗?如何找到这个问题的答案?
假定调用不同的文件上进行操作,他们的标志可以O_RDONLY,O_WRONLY或者两者兼而有之.
背景资料:
我一直在编写代码来控制通过USB线连接的设备,但是模拟RS-232串口.
有问题的设备是Arduino微控制器控制的伺服摇摄和倾斜阶段(但这并不重要).
我已经设法使用C++语言将字符写入USB模拟串行端口,并使用以下代码在NetBeans IDE中设置g ++编译器:
#include <cstdlib>
#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
/*
* 'open_port()' - Open serial port 1.
*
* Returns the file descriptor on success or -1 on error.
*/
int
open_port(void)
{
int fd; /* …Run Code Online (Sandbox Code Playgroud) 我正在尝试Serial.println()在Arduino IDE中的一个类中进行.但是,编译器说Serial这个范围没有声明.这是代码:
Menu.h中的代码
class Menu
{
public:
int options[4];
void test() {
Serial.println("here");
}
private:
};
Run Code Online (Sandbox Code Playgroud)
主文件中的代码:
#include "Menu.h"
Menu menu;
void setup() {
Serial.begin(9600);
menu.test();
}
void loop() {
}
Run Code Online (Sandbox Code Playgroud) 我目前使用twisted来连接到我拥有的串行设备,使用如下代码.
from twisted.internet import reactor
SerialPort(Handler(), "/dev/ttyACM1", reactor, baudrate='9600')
reactor.run()
Run Code Online (Sandbox Code Playgroud)
但是,我知道需要扩展应用程序以监视添加(和删除)的新串行设备.我目前使用pyinotify来寻找添加/删除的新设备,这看起来效果很好.
class EventHandler(pyinotify.ProcessEvent):
def process_IN_CREATE(self, event):
... connect to serial device
...
Run Code Online (Sandbox Code Playgroud)
目前我似乎有几个问题.我认为最大的问题是我对Twisted知之甚少,不知道这样做的"正确"方法是什么.
目前正如我所知,pyinotify事件处理程序在一个单独的线程中启动,这意味着反应堆没有在主线程中运行.这是一个问题吗?
连接第一个设备后,我很难添加第二个设备 - 尤其是在第二个设备添加时,反应堆已经在运行.即使我用一个保护它
if not reactor.running:
Run Code Online (Sandbox Code Playgroud)
第二个连接没有正确添加到反应器(至少connectionMade,dataReceived接收方法不会触发).
如果我首先启动反应器,然后让pyinotify事件尝试并添加到正在运行的反应器,这似乎也不起作用 - 设备连接,但dataReceived方法永远不会被调用.
基本上,我确信有一个简洁的方法让这个工作,我只是无法通过谷歌或反复试验找到它.任何人都可以向我建议我如何才能使这个工作?
提前感谢您提供的任何帮助,
西蒙
我有以下代码:
class SomeSharedData(object):
def __init__(self):
self._lock = RLock()
self._errors = 0
@property
def errors(self):
with self._lock:
return self._errors
@errors.setter
def errors(self, value):
with self._lock:
self._errors = value
Run Code Online (Sandbox Code Playgroud)
除了更多的属性,如errors.我的目标是易用性,而不是效率,所以过度锁定很好.
是否有更简洁的方法来定义这些属性?
到目前为止我提出的最好的是:
class thread_safe_property(object):
def __init__(self, name=None):
self.name = name
def __get__(self, obj, objtype):
with obj._lock:
return getattr(obj, self.name)
def __set__(self, obj, val):
with obj._lock:
setattr(obj, self.name, val)
class SomeSharedData(object):
def __init__(self):
self._lock = RLock()
self._errors = 0
errors = thread_safe_property('_errors')
Run Code Online (Sandbox Code Playgroud)
想法?更好的方法?
原始代码和新方法都会遇到类似语句的可能竞争条件data.errors += 1,但我很少需要执行这些操作,因此我在需要时添加了变通方法.
谢谢!
我似乎无法找到支持简单的Remove()函数的.NET线程安全/并发集合,我可以在其中删除特定项目或传入谓词以根据该项目删除项目.我试过了:
BlockingCollection<T>
ConcurrentQueue<T>
ConcurrentStack<T>
ConcurrentBag<T>
Run Code Online (Sandbox Code Playgroud)
有没有人知道支持这种行为的集合,还是我必须自己创建?
我希望能够从线程安全队列中获取下一个项目而不删除它,稍后如果满足某个条件,则继续删除它.
c# collections concurrency thread-safety concurrent-programming
背景:我需要将一个数值作为字节发送到外部设备,但我遇到了一个问题.我的代码是:
ser=serial.Serial("COM3",9600, timeout=0)
ser.write(value)
Run Code Online (Sandbox Code Playgroud)
其中"value"是我读过的int读过的.问题是,当我发送它时,它发送字符值,而不是实际值(它发送数字5的字节值31,因为这是它的unicode位置,我相信)
实际上,我希望能够以"\ x05"字符发送它.我想我的问题是,我将如何将int 5转换为char"\ x05",或将37转换为"\ x37"
我有一个 C++ 串行端口类,它具有无阻塞和用于读取操作的阻塞模式。对于阻塞模式:
COMMTIMEOUTS cto;
GetCommTimeouts(m_hFile,&cto);
// Set the new timeouts
cto.ReadIntervalTimeout = 0;
cto.ReadTotalTimeoutConstant = 0;
cto.ReadTotalTimeoutMultiplier = 0;
SetCommTimeouts(m_hFile,&cto)
Run Code Online (Sandbox Code Playgroud)
对于非阻塞模式:
COMMTIMEOUTS cto;
GetCommTimeouts(m_hFile,&cto);
// Set the new timeouts
cto.ReadIntervalTimeout = MAXDWORD;
cto.ReadTotalTimeoutConstant = 0;
cto.ReadTotalTimeoutMultiplier = 0;
SetCommTimeouts(m_hFile,&cto)
Run Code Online (Sandbox Code Playgroud)
我想添加另一种等待任意数量字节并读取它们的模式。
从 MSDN COMMTIMEOUTS 结构:
如果应用程序将ReadIntervalTimeout和ReadTotalTimeoutMultiplier 设置为MAXDWORD并将ReadTotalTimeoutConstant设置为大于零且小于MAXDWORD 的值,则在调用 ReadFile 函数时会发生以下情况之一:
这看起来像这样的代码:
COMMTIMEOUTS cto;
GetCommTimeouts(m_hFile,&cto);
// Set the new timeouts
cto.ReadIntervalTimeout …Run Code Online (Sandbox Code Playgroud) 有人说
当PIC发送中断时,PIC将不会从同一源发送另一个中断,直到通过I/O端口确认.这是因为中断处理程序通常操纵关键数据结构,并且不会经受新自身调用的中断(即它们不是可重入的).
我不明白.同一来源和不同来源的中断之间有什么不同吗?
我正在从 Window Service 运行存储过程C#。存储过程是一个相当繁重的查询,并且需要相当长的时间。
我想等到存储过程完成并返回值。
有什么方法可以确定存储过程已完成吗?
serial-port ×5
arduino ×3
c++ ×3
python ×3
c# ×2
linux ×2
attributes ×1
c ×1
c#-4.0 ×1
class ×1
collections ×1
concurrency ×1
interrupt ×1
kernel ×1
libc ×1
linux-kernel ×1
properties ×1
pyserial ×1
qt ×1
twisted ×1
winapi ×1