Tag: pthreads

每个进程的最大线程数 – sysconf(_SC_THREAD_THREADS_MAX)失败

我试图在UNIX机器上找到每个进程的最大线程数,并编写下面的代码以使用sysconf: #include #include #include #include #include int main() { errno = 0; long maxThreads = sysconf(_SC_THREAD_THREADS_MAX); if (maxThreads == -1 && errno == 0) { printf(“the variable corresponding to _SC_THREAD_THREADS_MAX ” “is associated with functionality that is not ” “supported by the system\n”); exit(1); } if (maxThreads == -1) { printf(“errno: %d\n”, errno); exit(1); } […]

创建多个线程后Pthread_create失败

我正在开发一个处理客户端连接的应用程序。 我正在为每个请求生成一个线程,因为会有短任务。 但是,在处理一定数量的连接后,我一直遇到问题。 具体来说,在381个连接之后,pthread_create无法创建新线程。 我知道如果应用程序资源耗尽,或者已经创建了超过PTHREAD_THREADS_MAX个线程,这可能会失败。 奇怪的是,当发生此错误时,前381个线程已经停止。 我没有使用pthread_join来等待这些线程停止,我相信pthreads不要求我以某种方式“停止”线程,如果我错了就纠正我(至少manpage没有提到这个)。 我想也许这可能是在同时产生多个线程时产生的,但是,我已经多次测试过,每次第382个线程创建都失败了。 有谁知道会发生什么? 任何帮助将不胜感激。 提前致谢。

pthread_join()用于异步线程

我编写了一个简单的演示程序,以便我可以理解pthread_join()函数。 我知道如何使用pthread_condition_wait()函数来允许异步线程,但我正在尝试理解如何使用pthread_join()函数执行类似的工作。 在下面的程序中,我将Thread 1s ID传递给Thread 2s函数。 在Thread 2s函数中,我调用pthread_join()函数并传入Thread 1s ID。 我希望这会导致线程1首先运行,然后线程2运行第二,但我得到的是它们都同时运行。 这是因为一次只有一个线程可以使用pthread_join()函数,并且当我从主线程调用它时我已经在使用pthread_join()函数了吗? #include #include #include void *functionCount1(); void *functionCount2(void*); int main() { /* How to Compile gcc -c foo gcc -pthread -o foo foo.o */ printf(“\n\n”); int rc; pthread_t thread1, thread2; /* Create two thread –I took out error checking for clarity*/ pthread_create( &thread1, NULL, […]

Java在C中易变?

我知道在Java中使用volatile 。 那是(基于维基百科的文章 ): 对volatile变量的读写有一个全局排序。 这意味着访问volatile字段的每个线程将在继续之前读取其当前值,而不是(可能)使用缓存值。 我也知道在C中存在volatile关键字,但在完全不同的上下文中,主要用于内存映射I / O. 所以我想知道,是否有一些像Java在C中volatile构造? 哪个会阻止读取变量的缓存值? 如果它不存在于C中,是否有一个带有这样的结构的库,比如pthread ?

OS X上的Pthread和gcc编译问题

我有一个在Linux上编译好的脚本(Ubuntu 11.04),但在OS X(Lion)上没有。 gcc -pthread -o hw1 hw1.c hw1.c:22: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘barr’ hw1.c: In function ‘__syncthreads’: hw1.c:53: error: ‘barr’ undeclared (first use in this function) hw1.c:53: error: (Each undeclared identifier is reported only once hw1.c:53: error: for each function it appears in.) hw1.c:54: error: ‘PTHREAD_BARRIER_SERIAL_THREAD’ undeclared (first use […]

如果我不关心返回值,是否需要pthread_exit?

如果我不关心我的线程的返回状态,我需要有一个pthread_exit吗? 我想知道在我的数据库pthreads中是否存在与不调用pthread_exit相关的一些细微资源问题。 谢谢。

为什么这个程序的multithreading版本更慢?

我正在尝试学习pthreads,我一直在试验一个试图检测数组上的变化的程序。 函数array_modifier()选择一个随机元素并切换它的值(1到0,反之亦然),然后hibernate一段时间(足够大,所以不会出现竞争条件,我知道这是不好的做法)。 change_detector()扫描数组,当元素与其先前值不匹配且等于1时,检测到更改并使用检测延迟更新diff数组。 当有一个change_detector()线程( NTHREADS==1 )时,它必须扫描整个数组。 当有更multithreading时,每个线程都分配了一部分数组。 每个探测器线程只捕获其数组部分的修改,因此您需要将所有4个线程的捕获时间相加,以获得捕获所有更改的总时间。 这是代码: #include #include #include #include #include #include #define TIME_INTERVAL 100 #define CHANGES 5000 #define UNUSED(x) ((void) x) typedef struct { unsigned int tid; } parm; static volatile unsigned int* my_array; static unsigned int* old_value; static struct timeval* time_array; static unsigned int N; static unsigned long int diff[NTHREADS] […]

将工作分成更multithreading需要更多时间,为什么?

我有一个小的C程序,它使用monte-carlo模拟计算pi ,它基本上只测试一个随机点[x,y],如果它在圆圈内部或外部。 为了近似pi,我必须使用大量的样本n ,其具有O(n)的直接比例复杂度。 因此,尝试计算大量样本n,我实现了POSIX线程 api以平衡计算能力。 我的代码如下所示: pthread_t worker[nthreads]; /* creates workers for each thread */ struct param aparam[nthreads]; /* struct param{ long* hits; long rounds; }; */ long nrounds = nsamples / nthreads; /* divide samples to subsets of equal rounds per thread */ for (int i = 0; i < nthreads; ++i) { […]

将原始数据类型转换为void指针类型

我正在读这里的 pthreads。 在一个例子中,他们给出了这个源代码。 在创建线程时,它们传递一个long类型,类型为void *类型到函数! 在函数内部,它们接收此值并反向转换以获得长值。 Q1:是否允许将指针类型转换为原始数据类型和副verca(在C和C ++中)? Q2。 如果是这样,这样做是好事吗? 它们不应该创建指向这个long类型的指针,然后将此指针类型转换为void *并将其传递给函数。 这种将原始类型转换为指针类型的想法我觉得很困惑? 可以理解,从任何指针类型转换为void *,但原始数据类型如何存储在void *类型中? 是否有可能在特定系统上,基本类型的大小可能会大于为指针类型分配的大小?

为什么没有lpthread标志的gcc链接?

我正在做一个互动项目,其中互斥体表现得很神秘。 我把它归结为这个应该明显陷入僵局的测试用例。 #include #include int main() { pthread_mutex_t test; pthread_mutex_init(&test, NULL); pthread_mutex_lock(&test); pthread_mutex_lock(&test); printf(“Took lock twice\n”); return 0; } 但是,当我在没有-lpthread标志的情况下编译时,不仅程序仍然可以编译和链接,它也可以在没有死锁的情况下运行。 为什么? gcc pthread_break.c -o pthread_test ./pthread_test Took lock twice 使用-lpthread标志进行编译会产生预期结果: gcc pthread_break.c -o pthread_test -lpthread ./pthread_test <- deadlocked here 我正在运行GCC 7.2.0版。