Articles of multithreading

各种java线程访问相同的variables

如果我有10个线程访问相同的variables(只读取它,而不是写),Java将允许这些读取variables同时或每个线程将排队阅读? 我对标准行为感兴趣,即没有特别小心访问variables。 该程序在Linux RedHat上运行。

内存映射对象在线程终止后会自动释放吗?

我有几个简单的问题。 如果我在C中创build一个新的子线程,在线程完成处理并终止之后,执行: 内存映射对象“自动”释放? (我知道C没有垃圾收集器,但此时孩子已经终止) 猜猜我贴得太快了。 find第二个问题的答案(供将来参考): http : //www.ibm.com/developerworks/linux/library/l-memory-leaks/index.html? ca= drs- 孩子可以返回一个值父线程? (这是否可以使用一些常见的例程?我知道孩子和父母的内存空间是相同的?) 另外我想提一下,操作系统是符合POSIX的。 谢谢,Neco

glibc,退出时closuresFILE *之间的可能竞态条件?

我已经提炼出一个更大的程序到底部显示的代码。 在valgrind中运行这个程序最终会报告这个错误: == 7234 ==大小4的读取无效 == 7234 == 0x34A7275FC8:_IO_file_write @@ GLIBC_2.2.5(在/usr/lib64/libc-2.15.so中) == 7234 == by 0x34A7275EA1:new_do_write(在/usr/lib64/libc-2.15.so中) == 7234 == by 0x34A7276D44:_IO_do_write @@ GLIBC_2.2.5(在/usr/lib64/libc-2.15.so中) == 7234 == 0x34A7278DB6:_IO_flush_all_lockp(在/usr/lib64/libc-2.15.so中) == 7234 == by 0x34A7278F07:_IO_cleanup(在/usr/lib64/libc-2.15.so中) == 7234 == by 0x34A7238BBF:__run_exit_handlers(在/usr/lib64/libc-2.15.so中) == 7234 == by 0x34A7238BF4:exit(in /usr/lib64/libc-2.15.so) == 7234 == by 0x34A722173B :(在main下面)(在/usr/lib64/libc-2.15.so中) == 7234 ==地址0x542f2e0在一个大小为568的块内是0字节 == 7234 == […]

Linux Pthreads用户级别或内核级别

可能重复: 调度器看到的linux上的pthread如何? Linux pthreads用户级线程或内核级线程?

都调用`fprintf(stdout,…)`和`fprintf(stderr,…)`保证与multithreading不交错?

假设我有两个线程打印stderr或stdout东西(相对较长),这两个线程的函数是线程安全的,他们永远不会“交错”字符? 所以,举个例子,如果我有“你好,世界”,我永远不会得到“HHellllo ,, WorldWorld”还是其他什么交错? 这是x86,GCC,Linux> 3.0。

在线程中显示对话框

我有一个pygtk添加其中有一个gtk.Button(),当按下必须做5秒的工作。 所以, 在信号处理程序中实现时间密集型函数的思想是一个线程。 首先,我在开头添加了gtk.gdk.threads_init()。 我的信号处理程序是def send_sms() ,我有另一个函数def send_sms_mycantos() ,我称之为线程。 threading.Thread(target = self.send_sms_mycantos, args=(phone_no, message_text, username, password)).start() 我也有一个显示对话框的function。 def dialog_notification(self, message, dialog_type): dlg = gtk.MessageDialog(self.window, gtk.DIALOG_DESTROY_WITH_PARENT, dialog_type, gtk.BUTTONS_CLOSE, message) dlg.run() dlg.destroy() 现在,如果我在我的线程中调用上述函数 self.dialog_notification("Message sent successfully", gtk.MESSAGE_INFO) 我得到这个错误。 SMSSender.py: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0. 这是实施线程的正确方法吗? 我究竟做错了什么。 错误就像线程不知道Xserver正在运行。

处理,如果没有足够的内存可用来启动这个线程c#

我有一个系统启动一个新的线程与应用程序的每个请求。 如果应用程序收到数百个请求,可能没有足够的内存来启动一个新的线程,所以它会抛出一个exception。 我想知道一个处理这种情况的理想机制。 就像,如果应用程序正在接收大量的请求,那么如果没有足够的内存或活动线程数达到最大,那么我会延迟处理其他请求。 但我不知道如何实现这一点。

计划优先级,Windows

基于msdn,windows os根据基础调度线程来调度线程,并用作提升dynamic优先级 系统将所有相同优先级的线程视为相等。 系统以循环方式为所有优先级最高的线程分配时间片。 如果这些线程都没有准备好运行,则系统以循环方式为所有具有次高优先级的线程分配时间片。 如果更高优先级的线程可以运行,则系统停止执行较低优先级的线程(不允许使用其时间片完成),并将全时间片分配给较高优先级的线程。 从上面的引用 系统将所有相同优先级的线程视为相等 这是否意味着系统会根据dynamic优先级来处理线程?基本优先级是否被用作dynamic优先级更改的下限? 谢谢

在Windows上修改堆栈,TIB和exception

我的问题的由来源于想要提供在Windows上支持用户提供堆栈的pthreads的实现。 具体来说, pthread_attr_setstack应该做一些有意义的事情。 我的实际需求比这个多一点,但是这对于这个post来说足够好了。 没有用于在光纤或线程API中提供堆栈的公共Win API。 我search了偷偷摸摸的后门,解决方法和黑客,没有任何进展。 实际上,我看到了winpthread源代码的灵感,忽略了任何提供给pthread_attr_setstack堆栈。 相反,我尝试了下面的“解决scheme”,看看它是否会工作。 我使用ConvertThreadToFiber , CreateFiberEx和SwitchToFiber的常用组合创build一个光纤。 在CreateFiberEx我提供了最小的堆栈大小。 在光纤的入口点,然后为堆栈分配内存,相应地更改TIB字段:“Stack Base”和“Stack Limit”(请参见http://en.wikipedia.org/wiki/Win32_Thread_Information_Block ),然后设置ESP到我的堆栈的高地址。 (在现实世界的情况下,我会设置堆栈比这更好,并改变EIP,以便这一步的行为更像POSIXfunction的swapcontext ,但你明白了)。 如果我在这个不同的堆栈上做任何操作系统调用,那么我几乎搞砸了(例如printf死亡)。 然而,这对我来说不是问题。 我可以确保我在自定义堆栈上从不确定调用(因此为什么我说我的实际需求有一点涉及)。 除了…我需要例外的工作。 而他们不! 具体来说,如果我尝试抛出并捕获exception,我修改的堆栈,然后我得到一个断言 未处理的exception在0xXXXXXXXX …. 所以我的(模糊)问题是,有没有人有任何洞察力,如何exception和自定义堆栈可能不是很好地一起玩? 我明白,这是完全不受支持的,除了零响应或“走开”以外,可以愉快地开展工作。 事实上,我已经决定了,我需要一个不同的解决scheme,尽pipe这涉及妥协,我可能会使用一个。 然而,好奇心越来越好,所以我想知道为什么这不起作用。 在一个相关的笔记,我想知道Cygwin如何处理这个ucontext。 源代码http://szupervigyor.ddsi.hu/source/in/openjdk-6-6b18-1.8.13/cacao-0.99.4/src/vm/jit/i386/cygwin/ucontext.c使用GetThreadContext / SetThreadContext实施ucontext。 但是,从实验中我看到,当从新的上下文中抛出exception时,这也失败了。 实际上, SetThreadContext调用甚至不更新TIB块! 编辑(根据@avakar的答案) 下面的代码与您的代码非常相似,performance出同样的错误。 不同的是,我不启动第二个线程暂停,但暂停它,然后尝试更改上下文。 这段代码展示了我在描述try-catch块在foo 。 也许这根本不合法。 值得注意的是,在这种情况下,当modifyThreadContext时,TIB的ExceptionList成员是一个有效的指针,而在你的例子中它是-1。 手动编辑这没有帮助。 正如我对你的回答评论所述。 这不是我所需要的。 我想从我目前的线程切换上下文。 但是, SetThreadContext的文档警告不要在活动线程上调用它。 所以我猜如果下面的代码不起作用,那么我没有机会使它在单个线程上工作。 namespace { HANDLE […]

如何使用PostThreadMessage从C ++closuresInternet Explorer

我试图启动iexplore.exe让它运行5秒,然后再closures它。 iexplore打开就好,但是当我调用PostThreadMessage时,它不会closures。 任何人都可以看到我做错了什么? 这是我的代码: CString IEPath = "C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE";//GetIEPath(); //IEPath += ' ' + url; std::string strCommand((LPCTSTR)IEPath); PROCESS_INFORMATION procinfo; STARTUPINFO startupinfo; GetStartupInfo(&startupinfo); CreateProcess( NULL, (char *)strCommand.c_str(),// name of executable module NULL, // lpProcessAttributes NULL, // lpThreadAttributes false, // handle inheritance option CREATE_SHARED_WOW_VDM, // creation flags NULL, // new environment block NULL, // current directory […]