- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是一个我们必须在没有 pthreads 的情况下进行多线程的作业。每个线程中要执行的代码计算 0 和输入整数参数之间的数字总和。到目前为止,该程序仅在使用单个线程时运行良好,但在尝试创建多个线程时出现段错误。
我从几个来源获得了一些代码并对其进行了修改以获得以下内容:
#define _GNU_SOURCE
#include <malloc.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
//Source for threading outline: http://www.evanjones.ca/software/threading.html
// 64kB stack
#define FIBER_STACK 1024*64
struct sum_runner_struct {
long long limit;
long long answer;
};
// The child threads will execute this function
int threadFunction( void* argument )
{
struct sum_runner_struct *arg_struct = (struct sum_runner_struct*) argument;
long long sum = 0;
long long i = 0;
//Calculate the sum of numbers between 0 and input argument
for (i; i <= arg_struct->limit; i++) {
sum+=i;
}
arg_struct->answer = sum;
printf( "child thread exiting\n" );
return 0;
}
int main(int argc, char **argv)
{
if (argc < 2) {
printf("Wrong number of args\n");
exit(-1);
}
int num_args = argc - 1;
struct sum_runner_struct args[num_args];
void* stack;
//Thread IDs
pid_t pids[num_args];
// Allocate the stack
stack = malloc( FIBER_STACK );
if ( stack == 0 )
{
perror( "malloc: could not allocate stack" );
exit( 1 );
}
printf( "Creating child threads\n" );
int i = 0;
for (i; i < num_args; i++) {
args[i].limit = atoll(argv[i + 1]);
// Call the clone system call to create the child threads
pids[i] = clone( &threadFunction, (char*) stack + FIBER_STACK,
SIGCHLD | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_VM, &args[i] );
if ( pids[i] == -1 )
{
perror( "clone" );
exit( 2 );
}
}
int j = 0;
for (j; j < num_args; j++) {
// Wait for the child threads to exit
pids[j] = waitpid( pids[j], 0, 0 );
//Prints the answers that were computed in the child threads
printf("Sum is %lld\n", args[j].answer);
if ( pids[j] == -1 )
{
perror( "waitpid" );
exit( 3 );
}
}
// Free the stack
free( stack );
printf( "Child threads returned and stack freed.\n" );
return 0;
}
使用gdb调试,程序执行到第70行,此时线程被创建:
pids[i] = clone( &threadFunction, (char*) stack + FIBER_STACK,
SIGCHLD | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_VM, &args[i] );
然后当我越过它时我得到这个:
70 pids[i] = clone( &threadFunction, (char*) stack + FIBER_STACK,
(gdb) s
Detaching after fork from child process 29143.
child thread exiting
Detaching after fork from child process 29144.
Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
同样,这只会在尝试创建多个线程时发生。该程序仅使用一个线程即可按预期工作。
如有任何帮助,我们将不胜感激!
最佳答案
您正在将相同的堆栈传递给所有线程。因此,线程将相互踩踏。以及为什么它适用于一个线程。
关于没有 pthreads 的 C 多线程 : "The program no longer exists" Seg fault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33643678/
我正在将一些 pthreads 代码添加到我使用 autotools 构建的 Linux 应用程序中。我收到关于未在 libpthreads 中链接的错误。所以我想在 autotools 中指定 pt
libpthread 库位于 Linux 系统的哪个目录中? 最佳答案 有多种方法可以找出这一点。 只需输入 find / -name 'libpthread.so' -print找到名为 libpt
pthread 属性对象是否需要在使用它们的对象的生命周期内存在,或者在使用它们后立即销毁它们是否安全?例如: // Create the mutex attributes. pthread_mute
到目前为止我读过的所有文档似乎都表明我的 vxWorks (6.8) 版本中存在 posix 线程支持,但是一个简单的测试应用程序无法按预期执行。来源如下: tTest.h #include cla
我试图找到指定 pthreads 标准的文档。我见过各种指向 IEEE 1003.1c-1995 的链接(即 Wikipedia 或 OpenGroup )。然而,当我在 IEEE 标准站点上搜索此文
我试图找到指定 pthreads 标准的文档。我见过各种指向 IEEE 1003.1c-1995 的链接(即 Wikipedia 或 OpenGroup )。然而,当我在 IEEE 标准站点上搜索此文
我在 MSVC 2010 上运行一个 pthread,我已经包含 pthreadVC2 .lib & .dll。来自以下网站 http://sourceware.org/pthreads-win32/
我的问题是: 如何在不更改其他 pthread 中的当前目录的情况下更改 pthread 中的当前目录,我找到了一个使用 openat() 函数的解决方案,但我没有找到任何解释它如何工作的示例。 使用
是否可以通过任何方式更改进程可以创建的 pthread 数量限制? 目前在我的 linux 系统上我可以创建大约 380 个线程,但我想增加它,只要内存可用。 最佳答案 减少用户的堆栈大小' ulim
问候。我正在尝试创建一个 autoconf 配置脚本,该脚本自动检查要使用的 pthread 选项,并且理想情况下,在使用 gcc 编译时指定 -pthread。 我希望 AX_PTHREAD 能够工
如何知道 pthread 是否死亡? 有办法检查 pthread 状态吗? 最佳答案 if(pthread_kill(the_thread, 0) == 0) { /* still runni
我正在从一个由互斥锁控制的固定大小的全局池中分配我的 pthread 线程特定数据。 (有问题的代码不允许动态分配内存;它允许使用的所有内存都由调用者作为单个缓冲区提供。pthreads 可能会分配内
在阅读了一些 MPI 规范后,我了解到,当使用 MPI_THREAD_SERIALIZED 进行初始化时,程序必须确保发生在不同线程中的 MPI_Send/Recv 调用不能重叠。换句话说,您需要一个
我尝试根据 this guide 安装 pthread win32 . 我将 pthreadVC2.dll 文件添加到 C:\Windows 并将 pthreadVC2.lib 文件添加到 C:\Pr
我有一个 pthreads 程序。我必须使用 Linux 中的 gcc -pthread(-pthreads 是无法识别的选项)和 Sun 中的 gcc -pthreads(-pthread 是无法识
我有一个包含文件名列表的文件,我想在其中搜索一个词并替换它我稍微修改了代码只是为了在这里只显示相关部分问题是如果我在该列表中只有一个文件,它不会用多线程处理它,因为线程只有在我有多个文件时才工作所以我
我正在编写一个 SMT 程序,并且正在尝试解决一个有趣的问题。 我需要所有函数一起退出,但是有些线程卡在障碍物上,即使我不希望它们这样做。 我的问题是:当我删除障碍时会发生什么?卡在屏障处的线程会释放
我阅读了有关 pthread 及其相关 API 的所有内容,以创建、锁定和同步不同的线程。但我经常发现线程池、消费者/生产者等词提示。我理解这些是 pthread 实现的模型。 任何人都可以让我知道
我在 man pthread_join 中读到,多个 pthread 不能加入一个已经加入的 pthread。还有另一种方法可以达到相同的结果吗?多个 pthread 挂起自己,直到某个特定的 pth
我知道 OpenMP 实际上只是一组编译成 pthread 的宏。有没有办法在编译的其余部分发生之前查看 pthread 代码?我正在使用 GCC 进行编译。 最佳答案 首先,OpenMP 不是一组简
我是一名优秀的程序员,十分优秀!