【问题标题】:"Segmentation fault" in multithreading with priority by c in linuxlinux中c优先级多线程中的“分段错误”
【发布时间】:2014-03-20 02:16:53
【问题描述】:

我正在尝试开发一个在 linux 中具有 c 优先级的多线程程序。所以我的代码如下。当我运行我的程序时,我遇到了“分段错误”。我不知道发生了什么。请帮帮我。

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

void *max(void *);
void *avg(void *);
void *min(void *);

int tmp[5];
int main(int argc, char* argv[]){

    pthread_t thread1;
    pthread_t thread2;
    pthread_t thread3;
    pthread_setschedprio(thread1,2);
    int i, j;
    printf("Input number: \n");
    for (j=0; j<5; j++) {
        printf("tmp[%d]: ",j);
        scanf("%d: ",&tmp[j]);
    }
    if ((i=pthread_create(&thread1, NULL, max, tmp)) != 0) {
        printf("thread creation failed. %d\n", i);
    }

    if ((i=pthread_create(&thread2, NULL, avg, tmp)) != 0) {
        printf("thread creation failed. %d\n", i);
    }
    if ((i=pthread_create(&thread3, NULL, min, tmp)) != 0) {
        printf("thread creation failed. %d\n", i);
    }

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    pthread_join(thread3, NULL);
    printf("Exiting main\n");
    return 0;
}
void *max(void *arg){
    int i;
    int *arr = (int *)arg;
    int max = arr[0];
    for(i=1;i<5;i++){
        if(max<arr[i]){
            max = arr[i];
        }
    }
    printf("Max of array is: %d\n", max);
    sleep(1);
    return NULL;
}

void *avg(void *arg){
    int i;
    int *arr = (int *)arg;
    int sum =0;
    float avg;
    for(i=0;i<5;i++){
        sum = sum + arr[i];
    }
    avg = sum/5.0;
    printf("Average of array is: %f\n",avg);
    sleep(1);
    return NULL;
}

void *min(void *arg){
    int i;
    int *arr = (int *)arg;
    int min = arr[0];
    for(i=1;i<5;i++){
        if(min>arr[i]){
            min = arr[i];
        }
    }
    printf("Min of array is: %d\n", min);
    sleep(1);
    return NULL;
}

【问题讨论】:

  • 嗨。所以我构建了你的代码并运行它,看起来像这样:pastebin.com/vtARWMuE - 没有分段错误。也许是比赛条件。 ps:gcc 命令gcc -lpthread -o t t.c 可能会帮助一些人重现。
  • 只是为了好玩,在循环中运行它,红宝石交出随机输入(并删除了睡眠),我不能让这个傻瓜为我的生命而崩溃。 while ruby -e '5.times { x = rand(9999999); $stderr.puts x; puts x }' | ./t ; do true; done
  • 是否允许在创建线程之前调用pthread_setschedprioprintf 线程安全吗?
  • 1.打开调试符号并关闭优化进行编译:-g -O0 2. $ gdb a.out 3. &gt; run 4. 崩溃 5. &gt; backtrace
  • @someuser 互斥锁应该保护什么?线程只从数组中读取,没有线程进行任何共享写入,因此没有竞争条件。此代码是无锁的。

标签: c linux multithreading thread-priority


【解决方案1】:

thread1 尚未初始化为有效值时,您正在调用pthread_setschedprio(thread1,2);。只有在创建线程后才能设置线程的优先级。

为了清楚起见,您应该指明注释掉对pthread_setschedprio(thread1,2) 的调用是否使程序能够在不崩溃的情况下运行。 (另外——你真的想要scanf()格式字符串中的冒号吗?)

【讨论】:

    【解决方案2】:

    这里:

    scanf("%d: ",&tmp[j]);
    

    可能是这条线造成了问题,请注意:%d 之后,我不认为这是这个地方。

    可能是这个原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      相关资源
      最近更新 更多