我有一个C++程序,它运行一堆线程来操作相同的数据.这些线程中的每一个都有一个指向正在被操纵的对象的指针,例如:
thread1和thread2都有一个指向object1的指针
object1-> addSomething()可以被thread1或2使用并引用同一个对象
现在,如果两个线程在同一时刻完成这些操作可能会给它们带来一些麻烦,所以我想要一个简单的阻塞机制.我想要的只是这个:
void method()
{
waitUntilFree()
blockForOthers()
doSomething()
unblock()
}
Run Code Online (Sandbox Code Playgroud)
有一个简单的方法吗?我只是想阻止并等到它是免费的.我不介意线程可能需要等待一段时间.有一个简单的机制来做到这一点?我使用Boost来处理这些线程,但我不能为我的生活找到一种方法来做这个(似乎很简单的)简单的块等待事情.
我想知道FileOutputStream.write(byte [])是否总是阻塞当前线程,导致ThreadContext开关,或者可能是如果操作系统缓冲区很大,则该操作不会阻止处理字节.
这些想法的原因是,我想知道我在我的应用程序中使用log4j进行的日志记录是否真的是性能损失,并且使用记录消息的队列是否会更快,这些消息由单独的线程读取并写入日志文件(我知道如果应用程序退出并且队列中的语句没有刷新到磁盘,吞没日志记录语句的缺点).
不,我还没有描述它,这些是相当概念性的想法.
我正在寻找一个简单的事件通知系统:
进程A阻塞直到它被...通知
进程B,触发进程A.
如果我在Win32中这样做,我可能会使用事件对象('A'块,当'B'执行SetEvent时).我需要一些非常快速和脏的东西(更喜欢脚本而不是C代码).你会建议什么样的东西?我想知道文件咨询锁,但它似乎很乱.其中一个进程必须主动打开文件才能保持锁定.
令人惊讶的是,我很难找到答案.
我有一个TCP客户端套接字,我可以成功连接并发送数据.但是,在发送数据之后,我期待从服务器返回响应.我检查了我的套接字,看起来它处于非阻塞模式.
if (fcntl(sc->connect_d, F_GETFL) && O_NONBLOCK)
{
//non blocking
}
Run Code Online (Sandbox Code Playgroud)
什么是启用阻止模式的宏,以便我可以更轻松地读取服务器响应?有人可以给我一个可以做到这一点的小片段吗?谢谢
我有一个调用Process.Start()运行第三方exe.我需要处理这个可执行文件的输出文件,所以我想要阻止对Process.Start()的调用.
是否可以将此呼叫更改为阻止呼叫?
Process sampleProcess= new Process();
sampleProcess.StartInfo = sampleProcessInfoObject;
sampleProcess.Start();
Run Code Online (Sandbox Code Playgroud) 我的Windows应用程序有一个标签界面.每个选项卡都会呈现一些UI内容.众所周知,如果我在主线程中进行非常耗时的for循环而不让其他人处理任何Windows消息,那么应用程序将被冻结.在冻结期间,我无法切换标签.
我受到了谷歌Chrome的多进程架构的启发.我尝试使用SetParent到嵌入过程到另一个过程.更具体一点:流程A是主人.它可以创建无限的工作流程.每个工作进程都有自己的消息循环.如果进程B被冻结,则不应冻结进程A和任何其他工作进程.
其实我错了:如果我点击按钮工作进程B在主线程中不间断地执行大量UI工作,不仅会阻止进程B的UI,还会阻止进程A的UI,直到我的测试代码结束.
有人可以分享一些灯吗?
我需要在SIGINT处理程序中执行清理功能,但无法将本地数据传递给它。这里是一个例子:
int main(int argc, char *argv[]) {
struct database *db = db_cursor();
sockfd_t master_socket = init_server();
signal(SIGINT, sigint_handler);
while (1) {
// accepting connections
}
}
void sigint_handler(int s) {
destroy_db(db);
shutdown(master_socket, SHUT_RDWR);
close(master_socket);
exit(EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)
我该如何实施这种行为?我试过使此变量为全局变量,但无法在编译时调用此函数(错误:initializer元素不是编译时常量)。
我有一个pthread,它对某些文件描述符进行无限轮询,并带有负超时参数.
从主线程,我希望能够向轮询线程指出它应该退出.
我做了一些研究,发现了以下方法:
使用pthread_cancel():这是不鼓励的,因为它可能导致意外后果,即不清除任何持有的资源或互斥量
使用变量作为标志并将其设置在主线程中.轮询线程每次迭代都会检查此标志,如果设置,则通过调用pthread_exit()退出.这种方法不起作用,因为我的轮询线程不循环,而只是无限期地阻塞,等待文件描述符.
任何人都可以建议一个优雅的解决方案吗?
谢谢!ASM
我在C#中使用HttpClient时疯狂...
我简化了我的项目,因此可以更轻松地复制我的问题.我想做的就是在后台调用HttpClient.PostAsync而不阻塞我的UI窗口(我正在使用WPF btw).
这是我的代码(将代码删到了min.):Bing仅用于此处不显示我的私人网络服务,它当然可以替换为其他所有网站.
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
try {
MyTextBlock.Text = "Waiting...";
Uri webUri = new Uri("https://www.bing.com/");
using (HttpClient client = new HttpClient()) {
using (HttpResponseMessage response = await client.PostAsync(webUri, new MultipartFormDataContent())) {
MyTextBlock.Text = await response.Content.ReadAsStringAsync();
}
}
} catch (Exception exc) {
MessageBox.Show(exc.ToString(), "Unhandled Exception");
}
}
Run Code Online (Sandbox Code Playgroud)
当我的UI正在等待异步发布请求时,它在TextBox中显示"Waiting".当异步请求返回时,它会显示结果.什么都不应该发生.
所以这里出现了问题,有时候PostAsync方法根本就不会返回......甚至会忽略Timeout.当我调试它总是有效,但当我尝试启动应用程序时,它有时会挂起.并不总是哪个不能让错误更容易找到.我尝试了多种方法来调用请求异步,但每次都是同样的问题.
我也阅读了以下博客,其中包含异步方法中的阻塞问题,但即使使用ConfigureAwait也没有区别. http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
我可以想象在HttpClient async方法中存在一个问题,锁定主线程,因此它会导致这个问题.Wenn我在ConsoleApplication中使用相同的代码一切都很好.我的客户端和目的地之间有一个代理,但这应该不是问题.
有人可以复制这个问题吗?我在.NET Framework 4.6.1中使用C#/ WPF.
blocking ×10
c++ ×3
c ×2
c# ×2
linux ×2
async-await ×1
concurrency ×1
delphi ×1
events ×1
httpclient ×1
io ×1
ipc ×1
java ×1
process ×1
pthreads ×1
sendmessage ×1
sigint ×1
signals ×1
sockets ×1
wpf ×1