标签: pthreads

为什么线程称为轻量级进程?

线程是"轻量级的",因为大部分开销已经通过创建其进程来完成.

我在其中一个教程中找到了这个.

有人可以详细说明它究竟意味着什么吗?

c multithreading pthreads

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

pthread_self()和gettid()有什么区别?我应该使用哪一个?

我正在尝试在Linux上设置线程的CPU亲和性.我想知道推荐以下哪种方法:

  1. 使用pthread_self()获取线程ID

    通过将线程id作为参数传递,使用pthread_setaffinity_np(....)设置CPU关联

  2. 使用gettid()调用获取线程ID

    通过在进程id的位置传递线程id,使用sched_setaffinity(....)设置CPU关联

PS:设置CPU亲和性后,我打算增加线程的调度优先级.

linux pthreads affinity

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

将整数值转换为void*并在POSIX中再次返回是否总是安全的?

这个问题几乎与我发现的其他一些问题相同,但这个问题特别涉及POSIX,这是我在pthreads中遇到的一个非常常见的例子.我主要关注当前的事态(即C99和POSIX.1-2008或更高版本),但任何有趣的历史信息当然也很有趣.

问题基本上归结为b是否总是采用与以下代码中的a相同的值:

long int a = /* some valid value */
void *ptr = (void *)a;
long int b = (long int)ptr;
Run Code Online (Sandbox Code Playgroud)

我知道这通常有效,但问题是它是否是正确的事情(即,C99和/或POSIX标准是否保证它能够正常工作).

说到C99,它似乎没有,我们有6.3.2.3:

5整数可以转换为任何指针类型.除了之前指定的,结果是实现定义,可能没有正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示.56)

6任何指针类型都可以转换为整数类型.除了之前指定的,结果是实现定义.如果结果无法以整数类型表示,则行为未定义.结果不必在任何整数类型的值范围内.

即使使用intptr_t,标准似乎只能保证任何有效的void*都可以转换为intptr_t并再次返回,但它不能保证任何intptr_t都可以转换为void*并再次返回.

但是,POSIX标准仍然可以允许这样做.

我没有很大的愿望使用void*作为任何变量的存储空间(即使POSIX应该允许它我觉得它很难看),但我觉得我必须要问因为pthreads_create函数的常用示例使用了start_routine的参数是一个整数,它作为void*传入,并在start_routine函数中转换为int或long int.例如,此联机帮助页有这样的示例(请参阅完整代码的链接):

//Last argument casts int to void *
pthread_create(&tid[i], NULL, sleeping, (void *)SLEEP_TIME);
/* ... */
void * sleeping(void *arg){
    //Casting void * back to int
    int sleep_time = (int)arg;
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

我也在教科书(Peter S. Pacheco的并行编程简介)中看到了类似的例子.考虑到它似乎是一个常见的例子,人们应该比我更了解这些东西,我想知道我是否错了,这实际上是一个安全和便携的事情.

c posix pthreads c99

23
推荐指数
2
解决办法
4155
查看次数

如果在共享内存中,pthread互斥锁是否可以跨线程工作?

我发现了这个: 快速进程间同步方法

我曾经认为pthread互斥锁只能在同一地址空间中的两个线程之间共享.

那里的问题/答案似乎意味着:

如果我有两个单独的程序A和B.它们有一个共享的内存区域M.我可以将一个pThread互斥锁放在M中,锁定在A中,锁定在B中,在A中解锁; 和B将不再阻止互斥锁.它是否正确?可以在两个独立的进程中共享pThread互斥锁吗?

编辑:我在MacOSX上使用C++.

c++ mutex pthreads process shared-memory

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

pthread同步阻塞队列

我正在寻找使用pthread同步语义在C中推荐的线程安全阻塞队列(多生产者/消费者)的实现.

c queue pthreads thread-safety

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

pthreads中的信号处理

我已经创建了一个pthread,并在其中安装了一个信号处理程序,就像我们在main( )函数中一样.线程的信号处理程序是一个单独的函数.令人惊讶的是,它不起作用,即线程的信号处理程序无法捕获信号.

这是代码:

#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <signal.h>

typedef struct data
{
 char name[10];
 int age;
}data;

void sig_func(int sig)
{
 printf("Caught signal: %d\n",sig);
 signal(SIGSEGV,sig_func);
}

void func(data *p)
{
 printf("This is from thread function\n");
 signal(SIGSEGV,sig_func); // Register signal handler inside thread
 strcpy(p->name,"Mr. Linux");
 p->age=30;
 sleep(2); // Sleep to catch the signal
}

int main()
{
 pthread_t tid;
 pthread_attr_t attr;
 data *ptr;

 pthread_attr_init(&attr);
 pthread_create(&tid,&attr,(void*)func,ptr);
 pthread_kill(tid,SIGSEGV);

 pthread_join(tid,NULL);
 printf("Name:%s\n",ptr->name);
 printf("Age:%d\n",ptr->age);
}
Run Code Online (Sandbox Code Playgroud)

输出:

分段错误(这意味着信号不会被处理程序捕获)

c signals pthreads

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

带螺纹的分叉和核心转储

这里这里之前已经提出与这个问题中的一个相似的点,并且我知道Google coredump库(我已经评估并发现它缺乏,但是如果我更好地理解这个问题,我可能会尝试并努力).

我想在不中断进程的情况下获取正在运行的Linux进程的核心转储.自然的方法是说:

if (!fork()) { abort(); }
Run Code Online (Sandbox Code Playgroud)

由于分叉进程获得原始进程内存的固定快照副本,因此我应该获得完整的核心转储,并且由于副本使用写时复制,因此通常应该很便宜.但是,这种方法的一个关键缺点是fork()只分叉当前线程,并且原始进程的所有其他线程将不存在于分叉副本中.

我的问题是,是否有可能以某种方式获得其他原始线程的相关数据.我不完全确定如何解决这个问题,但这里有几个我提出的子问题:

  1. 包含所有线程堆栈的内存是否仍然可用并在分叉进程中可访问?

  2. 是否可以(快速)枚举原始进程中的所有正在运行的线程并存储其堆栈基址的地址?据我了解,Linux上的线程堆栈的基础包含指向内核的线程簿记数据的指针,所以......

  3. 使用存储的线程基地址,您能读出分叉进程中每个原始线程的相关数据吗?

如果可能,也许只需要将其他线程的数据附加到核心转储.但是,如果该数据已经在fork的位置丢失,那么这种方法似乎没有任何希望.

c c++ linux coredump pthreads

22
推荐指数
1
解决办法
4192
查看次数

简单的pthread!C++

我不知道为什么这不起作用

#include <iostream>
#include <pthread.h>
using namespace std;

void *print_message(){

    cout << "Threading\n";
}



int main() {

    pthread_t t1;

    pthread_create(&t1, NULL, &print_message, NULL);
    cout << "Hello";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误:

[描述,资源,路径,位置,类型]初始化'int pthread_create的参数3(pthread_t*,const pthread_attr_t*,void*(*)(void*),void*)'threading.cpp threading/src line 24 C/C++问题

c++ pthreads

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

为什么pthread导致内存泄漏

每当我创建一个pthread时,valgrind就会输出内存泄漏,

例如下面的代码:

#include <stdio.h>
#include <unistd.h>
#include <pthread.h> 

void *timer1_function (void *eit){
  (void) eit;
    printf("hello world\n");
    pthread_exit(NULL);
}

int main(void){
   pthread_t timer1;
   pthread_create( &timer1, NULL, timer1_function,  NULL);  ///////line13
   int i=0;
   for(i=0;i<2;i++){usleep(1);}
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

valgrind输出

==1395== HEAP SUMMARY:
==1395==     in use at exit: 136 bytes in 1 blocks
==1395==   total heap usage: 6 allocs, 5 frees, 1,134 bytes allocated
==1395== 
==1395== 136 bytes in 1 blocks are possibly lost in loss record 1 of 1
==1395==    at 0x402A629: calloc (in …
Run Code Online (Sandbox Code Playgroud)

c valgrind posix memory-leaks pthreads

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

每个线程都有自己的堆栈吗?

当我从进程创建多个线程时,每个线程是否都有自己的堆栈,或者它们是否共享其父进程的堆栈.线程进行系统调用时会发生什么?线程是否也像进程一样维护自己的内核堆栈?

c c++ stack multithreading pthreads

21
推荐指数
1
解决办法
8442
查看次数