为什么POSIX互斥量被认为比futex更重或更慢?pthread互斥锁类型的开销来自哪里?我听说pthread互斥体基于互斥体,当无争议时,不要对内核进行任何调用.那时似乎pthread互斥体只是一个围绕futex的"包装器".
开销只是在函数包装调用中,并且需要互斥函数来"设置"futex(即,基本上是pthread互斥函数调用的堆栈设置)?或者pthread互斥锁是否有一些额外的内存屏障步骤?
在Linux(内核2.6.5)上,我们的构建系统调用gcc -D_REENTRANT.
使用时仍然需要这个pthreads吗?
它与gcc -pthread选项有什么关系?我知道我应该使用-pthreadpthreads,我还需要-D_REENTRANT吗?
另外,你知道在gcc 3.3.3和gcc 4.xx之间使用REENTRANT之间有什么区别吗?
当我使用-pthreadgcc选项时,我可以看到它_REENTRANT被定义了.-D_REENTRANT从命令行省略会有什么不同,例如,某些对象可以在没有多线程支持的情况下编译,然后链接到使用pthreads的二进制文件并导致问题吗?
我认为应该可以使用: g++ -pthread
> echo | g++ -E -dM -c - > singlethreaded
> echo | g++ -pthread -E -dM -c - > multithreaded
> diff singlethreaded multithreaded
39a40
> #define _REENTRANT 1
Run Code Online (Sandbox Code Playgroud)
我们正在编译多个静态库和与静态库链接的应用程序,库和应用程序都使用pthread.
我相信它在过去的某个阶段是必需的,但想知道它是否仍然需要.谷歌搜索没有返回任何最近提到的信息 - D_REENTRANT用pthreads.你能指点我讨论在最近版本的kernel/gcc/pthread中使用的链接或引用吗?
澄清:目前我们正在使用-D_REENTRANT和-lpthread,我假设我可以用g ++ -pthread替换它们,看看man gcc它为预处理器和链接器设置了标志.有什么想法吗?
我使用pthread_create(&thread1, &attrs, //... , //...);并需要一些条件发生需要杀死这个线程如何杀死这个?
我有一个pthread_t,我想改变它的CPU亲和力.问题是我使用的是glibc 2.3.2,它没有pthread_setaffinity_np().但这没关系,因为pthread_setaffinity_np()本身就是sched_setaffinity()的包装器,可以通过传递线程ID而不是进程ID来调用,以设置任意线程的关联.
但是 ...... sched_setaffinity可以使用的线程ID是一个操作系统线程ID,可以从gettid()系统调用获得.这与opaque类型pthread_t不同,gettid()只返回当前线程的thread-id .我需要能够设置任意线程的CPU亲和性.
不幸的是,我无法访问pthread的私有部分,这会让我通过将pthread_t转换为a来窃取线程ID struct pthread *.我想,更好的是,因为依赖私有实现需要更多麻烦.
我也一直在阅读pthread_getunique_np函数,但是这会返回一个"唯一的整数标识符" - 我认为它不会以任何形式或形式等同于OS线程ID.
因此,问题是:如何从任意pthread_t获取线程ID?
鉴于pthread_spin_lock可用,我什么时候可以使用它,什么时候不应该使用它们?
即我如何决定使用pthread互斥锁或pthread自旋锁来保护某些共享数据结构?
我pthread_cond_wait(&cond_t, &mutex);在我的程序中使用,我想知道为什么这个函数需要作为第二个参数mutex变量.
是否pthread_cond_wait()在开始时解锁互斥锁(执行开始pthread_cond_wait())然后在完成时(就在离开之前pthread_cond_wait())锁定?
我有一个可连接的pthread运行器函数,定义如下:
void *sumOfProducts(void *param)
{
...
pthread_exit(0);
}
Run Code Online (Sandbox Code Playgroud)
该线程应该加入主线程.
每当我通过Valgrind运行我的程序时,我会得到以下泄漏:
LEAK SUMMARY:
definitely lost: 0 bytes in 0 blocks
indirectly lost: 0 bytes in 0 blocks
possibly lost: 0 bytes in 0 blocks
still reachable: 968 bytes in 5 blocks
suppressed: 0 bytes in 0 blocks
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 10)
Run Code Online (Sandbox Code Playgroud)
我检查了pthreads的手册页,其中说:
The new thread terminates in one of the following ways:
* It calls pthread_exit(3), specifying an exit status value that …Run Code Online (Sandbox Code Playgroud) 我刚刚回顾了一些非常糟糕的代码 - 通过创建一个新线程来在串行端口上发送消息的代码,以便在发送的每条消息的新线程中打包和组装消息.是的,对于创建pthread的每条消息,正确设置了位,然后线程终止.我不知道为什么有人会做这样的事情,但它提出了一个问题 - 实际创建一个线程有多少开销?
您建议在C中使用pthreads线程池进行哪些开源实现?
如果此实现是:
我写了一个基于posix套接字的客户端程序.该程序创建多个线程,并将锁定服务器.但是在gdb时间调试期间,程序会给出一个信息(错误)
Run Code Online (Sandbox Code Playgroud)(gdb) n Program received signal SIGPIPE, Broken pipe. [Switching to Thread 0xb74c0b40 (LWP 4864)] 0xb7fdd424 in __kernel_vsyscall () (gdb)
这是代码:
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
int get_hostname_by_ip(char* h , char* ip)
{
struct hostent *he;
struct in_addr **addr_list;
int i;
if ((he = gethostbyname(h)) == NULL)
{
perror("gethostbyname");
return 1;
}
addr_list = (struct in_addr **) he->h_addr_list;
for(i = 0; addr_list[i] != NULL; i++) …Run Code Online (Sandbox Code Playgroud)