标签: pthreads

为什么pthread mutex被认为比futex"慢"?

为什么POSIX互斥量被认为比futex更重或更慢?pthread互斥锁类型的开销来自哪里?我听说pthread互斥体基于互斥体,当无争议时,不要对内核进行任何调用.那时似乎pthread互斥体只是一个围绕futex的"包装器".

开销只是在函数包装调用中,并且需要互斥函数来"设置"futex(即,基本上是pthread互斥函数调用的堆栈设置)?或者pthread互斥锁是否有一些额外的内存屏障步骤?

c linux pthreads futex

40
推荐指数
4
解决办法
2万
查看次数

我需要-D_REENTRANT和-pthreads吗?

在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_REENTRANTpthreads.你能指点我讨论在最近版本的kernel/gcc/pthread中使用的链接或引用吗?

澄清:目前我们正在使用-D_REENTRANT和-lpthread,我假设我可以用g ++ -pthread替换它们,看看man gcc它为预处理器和链接器设置了标志.有什么想法吗?

linux gcc pthreads

39
推荐指数
3
解决办法
3万
查看次数

在Pthread库中杀死线程

我使用pthread_create(&thread1, &attrs, //... , //...);并需要一些条件发生需要杀死这个线程如何杀死这个?

c multithreading posix pthreads

39
推荐指数
3
解决办法
8万
查看次数

如何从任意pthread_t获取线程ID?

我有一个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?

c unix linux pthreads system-calls

38
推荐指数
2
解决办法
7万
查看次数

什么时候使用pthread_spin_lock是正确的(例如pthread互斥锁)?

鉴于pthread_spin_lock可用,我什么时候可以使用它,什么时候不应该使用它们?

即我如何决定使用pthread互斥锁或pthread自旋锁来保护某些共享数据结构?

c pthreads

38
推荐指数
3
解决办法
2万
查看次数

pthread_cond_wait(&cond_t,&mutex); 解锁然后锁定互斥锁?

pthread_cond_wait(&cond_t, &mutex);在我的程序中使用,我想知道为什么这个函数需要作为第二个参数mutex变量.

是否pthread_cond_wait()在开始时解锁互斥锁(执行开始pthread_cond_wait())然后在完成时(就在离开之前pthread_cond_wait())锁定?

c mutex pthreads

38
推荐指数
3
解决办法
3万
查看次数

pthread_exit与return

我有一个可连接的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)

c linux valgrind pthreads

37
推荐指数
2
解决办法
2万
查看次数

创建线程时有多少开销?

我刚刚回顾了一些非常糟糕的代码 - 通过创建一个新线程来在串行端口上发送消息的代码,以便在发送的每条消息的新线程中打包和组装消息.是的,对于创建pthread的每条消息,正确设置了位,然后线程终止.我不知道为什么有人会做这样的事情,但它提出了一个问题 - 实际创建一个线程有多少开销?

c++ posix pthreads

37
推荐指数
8
解决办法
4万
查看次数

现有的线程池C实现

您建议在C中使用pthreads线程池进行哪些开源实现?

如果此实现是:

  • 轻量级:glib,APR,NSPR和其他产品都有很大的买入,我宁愿只有2个文件(标题和实现).
  • 在多个平台上测试(Linux,BSD,Mac OS X等).
  • 仍然保持.

c multithreading open-source pthreads threadpool

36
推荐指数
3
解决办法
3万
查看次数

程序收到信号SIGPIPE,Broken pipe.?

我写了一个基于posix套接字的客户端程序.该程序创建多个线程,并将锁定服务器.但是在gdb时间调试期间,程序会给出一个信息(错误)

(gdb) n
Program received signal SIGPIPE, Broken pipe. [Switching to Thread 0xb74c0b40 (LWP 4864)] 0xb7fdd424 in __kernel_vsyscall () 
(gdb) 
Run Code Online (Sandbox Code Playgroud)

这是代码:

#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)

c sockets gdb pthreads sigpipe

35
推荐指数
5
解决办法
6万
查看次数