我需要将多个参数传递给我想在一个单独的线程上调用的函数.我已经读过,执行此操作的典型方法是定义结构,向函数传递指向该结构的指针,并为参数取消引用它.但是,我无法让它工作:
#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)
但是当我运行它时,我实际得到: …
两者之间有什么区别吗?
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)
如果我只使用第一种方法,我是否足够安全?
注意:我的问题主要是指非常小的程序,我最多会将几个客户端连接到服务器并使用工作线程解决它们的查询.
我在某处读到我们应该在调用pthread_cond_signal之前锁定互斥锁并在调用它后解锁互斥锁:
pthread_cond_signal()例程用于发信号(或唤醒)正在等待条件变量的另一个线程.它应该在锁定互斥锁后调用,并且必须解锁互斥锁才能完成pthread_cond_wait()例程.
我的问题是:在不锁定互斥锁的情况下调用pthread_cond_signal或pthread_cond_broadcast方法是不是可以?
在linux c程序中,如何打印pthread库创建的线程的线程id?
对于我们:我们可以得到一个过程的pidgetpid()
假设我有一个类如
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*)'
我一直在努力理解POSIX线程和POSIX信号如何相互作用的复杂性.特别是,我对以下内容感兴趣:
关于为什么我想要这个的参考,我正在研究如何将TclX包转换为支持线程,或者将其拆分并至少使一些有用的部分支持线程.信号是特别感兴趣的部分之一.
pthread库提供的信号量和互斥量有什么区别?
单身类的通常模式就像
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?
首先,我使用pthread库编写多线程C程序.线程总是被等待的互斥锁挂起.当我使用strace实用程序查找线程处于FUTEX_WAIT状态时,我想知道当时哪个线程持有该互斥锁.但我不知道怎么能做到.有没有公用事业可以做到这一点?
有人告诉我Java虚拟机支持这个,所以我想知道Linux是否支持这个功能.