首页 > 解决方案 > C语言中最长回文子序列多线程

问题描述

我正在尝试学习如何使用 c 进行多线程处理,并认为最长的回文子序列问题将是一个很好的起点。

这个想法是我们运行两个线程并比较它们的结果以找到答案。一个线程处理“奇数”子序列,另一个线程处理“偶数”子序列。

尽管下面的代码似乎有效,但我的问题是:我应该在程序的哪个位置检查多线程错误?这对我来说很新,所以我只需要知道哪些部分可能容易出现多线程带来的问题。

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

struct str{
  char* seq;
  int len;
};

void *odd(void* arg){
  struct str index = *(struct str*)arg;
  int maxAns = 1;
  for(int i = 1; i < index.len; i++){
    int low = i - 1;
    int high = i + 1;
    int currMax = 1;
    while(low >= 0 && high < index.len && index.seq[low] == index.seq[high]){
      low--;
      high++;
      currMax=currMax+2;
    }
    if(currMax > maxAns){
      maxAns = currMax;
    }
  }
  int* res = malloc(sizeof(int));
  *res = maxAns;
  free(arg);
  return (void*)res;
}

void *even(void* arg){
  struct str index = *(struct str*)arg;
  int maxAns = 0;
  for(int i = 0; i < index.len; i++){
    int low = i;
    int high = i + 1;
    int currMax = 0;
    while(low >= 0 && high < index.len && index.seq[low] == index.seq[high]){
      low--;
      high++;
      currMax=currMax+2;
    }
    if(currMax > maxAns){
      maxAns = currMax;
    }
  }
  int* res = malloc(sizeof(int));
  *res = maxAns;
  free(arg);
  return (void*)res;
}

int main(void){

  char seq0[] = "aaasaaasadaadsdafa";
  int len = sizeof(seq0)/sizeof(seq0[0])-1;

  struct str* s0 = malloc(sizeof(struct str));
  struct str* s1 = malloc(sizeof(struct str));
  s0->seq = (char*)seq0;
  s1->seq = (char*)seq0;
  s0->len = len;
  s1->len = len;

  pthread_t t0;
  pthread_t t1;
  int* res0;
  int* res1;
  if (pthread_create(&t0, NULL, &odd, s0)!=0){
    return 0;
  }
  if (pthread_create(&t1, NULL, &even, s1)!=0){
    return 00;
  }
  if(pthread_join(t0, (void**)&res0)!=0){
    return 1;
  }
  if(pthread_join(t1, (void**)&res1)!=0){
    return 11;
  }

  if(*res0 > *res1){
    printf("%d\n", *res0);
  }else{
    printf("%d\n", *res1);
  }

  free(s0);
  free(s1);
  return 0;
}

标签: cmultithreading

解决方案


推荐阅读