Articles of multithreading

pthread – 如何开始运行一个新的线程,而无需调用连接?

我想从主线程开始一个新的线程。 我不能使用连接,因为我不想等待线程退出并继续执行。 基本上我需要的是类似pthread_start(…),虽然找不到它。 编辑: 由于所有的答案build议create_thread应该开始线程的问题是,在简单的代码下面,它不工作。 下面程序的输出是“主线程”。 这似乎是从未执行的子线程。 任何想法,我错了? 编译并运行在Fedora 14 GCC 4.5.1版上 void *thread_proc(void* x) { printf ("sub thread.\n"); pthread_exit(NULL); } int main() { pthread_t t1; int res = pthread_create(&t1, NULL, thread_proc, NULL); if (res) { printf ("error %d\n", res); } printf("main thread\n"); return 0; }

为什么使用std :: thread :: hardware_concurrency()和boost :: thread :: hardware_concurrency()有区别?

问题本身的描述非常简单。 我正在testing在C + + 11和boost ::线程库的std ::线程库的差异。 这些输出: #include <iostream> #include <thread> #include <boost/thread.hpp> int main() { std::cout << std::thread::hardware_concurrency() << std::endl; std::cout << boost::thread::hardware_concurrency() << std::endl; return 0; } 给了我不同的结果: 0 4 这是为什么? PS:gcc软件包的版本是4.6.2-1.fc16(x86_64)。 我在用着 g++ test.cc -Wall -std=c++0x -lboost_thread-mt -lpthread

用Java来强制虚惊一场

这个问题不是关于虚假的唤醒是否真的很开心,因为这已经在这里全面讨论了: 虚假的唤醒是否真的发生? 因此,这也不是关于,为什么我必须围绕我的wait声明。 这是关于什么的: 我想构build一个虚构的唤醒事件。 我在上面提到的问题中学到的是: 如果一个Linux进程发出信号,它的等待线程将每个都享受一个很好的,热的虚假唤醒。 所以看来,这只会工作在一台Linux机器,实际上我有Ubuntu 11.04 – 64位。 我已经写了一个Java程序,其中有一个线程正在等待一个条件,但是没有循环,而另一个线程正在等待并由另一个线程得到通知。 我认为在一个JVM中启动所有三个线程将强制上述情况,但似乎并非如此。 有没有人有另一个想法如何在Java中构build这样的情况?

Linux线程挂起/恢复

我写了一个代码,其中有两个线程并行运行。 第一个是启动第二个线程的主线程。 第二个线程只是一个简单的线程执行空while循环。 现在我想暂停/挂起第二线程的执行第一线程谁创build它。 过了一段时间,我想恢复执行第二个线程(通过发出一些命令或函数)从暂停/暂停的地方。

multithreading进程的线程ID是否可以与其他正在运行的进程的进程ID相同?

我试图find一种方法来唯一标识多进程环境中的线程。 我有一个服务器,跟踪不同的进程连接到它,其中一些是multithreading的,其中一些不是。 为了从multithreading连接中识别线程,我使用线程ID作为唯一的标识符(在任何给定时间最多连接1个multithreading进程)。 我的问题是:是否有可能其中一个线程的线程ID可能与系统上运行的另一个进程的进程ID相同? 先谢谢您的帮助!

我如何接受Perl中的多个TCP连接?

我有一个用于Linux的Perl脚本的问题。 主要目的是成为三个应用程序之间的中间人。 它应该做什么: 它应该能够等待$udp_port上的UDP文本(不含空格) 当它收到这个UDP文本时,它应该把它转发给连接的TCP客户端 问题是我的应用程序目前工作,直到我第一次与TCP客户端断开连接。 然后我无法连接到它,并且它在$udp_port上接收到下一个UDP数据包后超时。 所以基本上每当我想重新连接TCP时,我必须重新启动应用程序。 所有这些应该尽可能快(每毫秒计数)。 发送到UDP或TCP的文本不包含空格。 没有必要一次支持多个TCP客户端,但肯定会有好处:-) 这是我现在的代码: #!/usr/bin/perl use strict; use warnings; use IO::Socket; use Net::hostent; use threads; use threads::shared; my $tcp_port = "10008"; # connection from TCP Client my $udp_port = "2099"; # connection from Announcer my $udp_password = ""; # password from Announcer my $title = "Middle Man […]

哪个线程处理信号?

我有2个线程(thread1和thread2)。 我有SIGINT信号处理。 每当SIGINT发生时,线程2都应该处理信号。 为此我写下了程序 void sig_hand(int no) //signal handler { printf("handler executing…\n"); getchar(); } void* thread1(void *arg1) //thread1 { while(1) { printf("thread1 active\n"); sleep(1); } } void * thread2(void * arg2) //thread2 { signal(2, sig_hand); while(1) { printf("thread2 active\n"); sleep(3); } } int main() { pthread_t t1; pthread_t t1; pthread_create(&t1, NULL, thread1, NULL); pthread_create(&t2, NULL, […]

在Linux上如何实现POSIX线程?

我想知道,通过pthreads库创build的线程实际上是内核级线程还是与内核无关的用户空间线程? 我听到了这个相互排斥的意见,所以我想知道事实。

如何在多个线程中使用printf()

我正在实现一个使用不同内核的multithreading程序,并且许multithreading被同时执行。 每个线程都进行printf()调用,结果是不可读的。 我怎样才能使printf()primefaces,以便一个线程中的printf()调用不会与另一个线程中的printf()调用冲突?

如何closures文件?

经过多年的经验,我感到与Posix的和平。 然后,我读了大约2002年的Linus Torvalds的这个消息: int ret; do { ret = close(fd); } while(ret == -1 && errno != EBADF); 没有。 以上是 (a)不可携带 (b)不是目前的做法 “不可移植的”部分来自于(正如有人指出的),内核在错误的情况下closures了FD的线程环境,FD可能已被有效地重新使用(由内核)用于其他线程,第二次closuresFD是一个BUG。 不仅循环,直到EBADF不可移植,但任何循环,由于竞争条件,我可能会注意到,如果我没有“理所当然地把这样的事情理所当然”。 但是,在GCC C ++标准库实现中,我们有basic_file_stdio.cc do __err = fclose(_M_cfile); while (__err && errno == EINTR); 这个图书馆的主要目标是Linux,但似乎没有听取Linus的意见。 据我了解, EINTR只有在系统调用被阻塞后才会发生,这意味着内核在开始任何被中断的工作之前接收到释放描述符的请求。 所以没有必要循环。 事实上, SA_RESTART信号行为不适用于默认情况下close并生成这样的循环,正是因为它是不安全的。 这是一个标准的库错误,对吧? 在每个由C ++应用程序closures的文件上。 编辑:为了避免在一些大师带着答案出现之前引起太多的警告,我应该注意, close似乎只能在特定情况下阻止,也许这些都不适用于常规文件。 我并不清楚所有的细节,但是不应该在没有selectfcntl或setsockopt情况下close EINTR 。 不过,这种可能性使得通用库代码更加危险。