标签: pthreads

函数的多个参数由pthread_create()调用?

我需要将多个参数传递给我想在一个单独的线程上调用的函数.我已经读过,执行此操作的典型方法是定义结构,向函数传递指向该结构的指针,并为参数取消引用它.但是,我无法让它工作:

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

struct arg_struct {
    int arg1;
    int arg2;
};

void *print_the_arguments(void *arguments)
{
    struct arg_struct *args = (struct arg_struct *)args;
    printf("%d\n", args -> arg1);
    printf("%d\n", args -> arg2);
    pthread_exit(NULL);
    return NULL;
}

int main()
{
    pthread_t some_thread;
    struct arg_struct args;
    args.arg1 = 5;
    args.arg2 = 7;

    if (pthread_create(&some_thread, NULL, &print_the_arguments, (void *)&args) != 0) {
        printf("Uh-oh!\n");
        return -1;
    }

    return pthread_join(some_thread, NULL); /* Wait until thread is finished */
}
Run Code Online (Sandbox Code Playgroud)

这个输出应该是:

5
7
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,我实际得到: …

c pthreads

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

PTHREAD_MUTEX_INITIALIZER与pthread_mutex_init(&mutex,param)

两者之间有什么区别吗?

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
Run Code Online (Sandbox Code Playgroud)

要么

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);
Run Code Online (Sandbox Code Playgroud)

如果我只使用第一种方法,我是否足够安全?

注意:我的问题主要是指非常小的程序,我最多会将几个客户端连接到服务器并使用工作线程解决它们的查询.

c ubuntu mutex pthreads

82
推荐指数
4
解决办法
7万
查看次数

什么是可重入锁定和概念?

我总是感到困惑.有人会解释Reentrant在不同背景下的含义吗?为什么要使用折返与非折返?

说pthread(posix)锁定原语,它们是否可以重入?使用它们时应该避免哪些陷阱?

互斥是重入的吗?

multithreading locking pthreads

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

在不锁定互斥锁的情况下调用pthread_cond_signal

我在某处读到我们应该在调用pthread_cond_signal之前锁定互斥锁并在调用它后解锁互斥锁:

pthread_cond_signal()例程用于发信号(或唤醒)正在等待条件变量的另一个线程.它应该在锁定互斥锁后调用,并且必须解锁互斥锁才能完成pthread_cond_wait()例程.

我的问题是:在不锁定互斥锁的情况下调用pthread_cond_signalpthread_cond_broadcast方法是不是可以?

c++ mutex signals pthreads condition-variable

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

如何在linux c程序中获取pthread的线程ID?

在linux c程序中,如何打印pthread库创建的线程的线程id?
对于我们:我们可以得到一个过程的pidgetpid()

c linux pthreads

78
推荐指数
7
解决办法
20万
查看次数

一个类的pthread函数

假设我有一个类如

class c { 
    // ...
    void *print(void *){ cout << "Hello"; }
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个c的向量

vector<c> classes; pthread_t t1;
classes.push_back(c());
classes.push_back(c());
Run Code Online (Sandbox Code Playgroud)

现在,我想创建一个线程 c.print();

以下是给我以下问题: pthread_create(&t1, NULL, &c[0].print, NULL);

错误输出:无法将'void*(tree_item :: )(void)'转换为'void*()(void)'以将参数'3'转换为'int pthread_create(pthread_t*,const pthread_attr_t*,void*()(void),void*)'

c++ pthreads

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

POSIX线程和信号

我一直在努力理解POSIX线程和POSIX信号如何相互作用的复杂性.特别是,我对以下内容感兴趣:

  • 什么是控制信号传递到哪个线程的最佳方法(假设它首先不是致命的)?
  • 告诉另一个线程(可能实际上很忙)信号已经到达的最佳方法是什么?(我已经知道从信号处理程序使用pthread条件变量是一个坏主意.)
  • 如何安全地处理将信号发生的信息传递给其他线程?这是否需要在信号处理程序中发生?(我一般不想杀死其他线程;我需要一个更微妙的方法.)

关于为什么我想要这个的参考,我正在研究如何将TclX包转换为支持线程,或者将其拆分并至少使一些有用的部分支持线程.信号是特别感兴趣的部分之一.

c signals pthreads

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

pthreads mutex vs semaphore

pthread库提供的信号量和互斥量有什么区别?

c linux synchronization mutex pthreads

70
推荐指数
4
解决办法
7万
查看次数

C++中高效的线程安全单例

单身类的通常模式就像

static Foo &getInst()
{
  static Foo *inst = NULL;
  if(inst == NULL)
    inst = new Foo(...);
  return *inst;    
}
Run Code Online (Sandbox Code Playgroud)

但是,我的理解是这个解决方案不是线程安全的,因为1)Foo的构造函数可能被多次调用(可能或可能不重要)和2)inst在返回到不同的线程之前可能没有完全构造.

一种解决方案是围绕整个方法包装一个互斥锁,但是在我真正需要它之后很长时间我就要付出同步开销.另一种选择是

static Foo &getInst()
{
  static Foo *inst = NULL;
  if(inst == NULL)
  {
    pthread_mutex_lock(&mutex);
    if(inst == NULL)
      inst = new Foo(...);
    pthread_mutex_unlock(&mutex);
  }
  return *inst;    
}
Run Code Online (Sandbox Code Playgroud)

这是正确的做法,还是我应该注意哪些陷阱?例如,是否存在可能发生的静态初始化顺序问题,即在第一次调用getInst时,inst总是保证为NULL?

c++ singleton pthreads thread-safety

67
推荐指数
4
解决办法
7万
查看次数

是否可以确定持有互斥锁的线程?

首先,我使用pthread库编写多线程C程序.线程总是被等待的互斥锁挂起.当我使用strace实用程序查找线程处于FUTEX_WAIT状态时,我想知道当时哪个线程持有该互斥锁.但我不知道怎么能做到.有没有公​​用事业可以做到这一点?

有人告诉我Java虚拟机支持这个,所以我想知道Linux是否支持这个功能.

c linux multithreading mutex pthreads

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