c - 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;
}
解决方案
推荐阅读
- sql - PostgreSQL:仅当表存在时才从表中选择
- python - 从 unittest 中调用 subprocess.Popen 失败,但从 __main__ 调用时有效
- python - SQLAlchemy:通过删除重复项并保留最大值来选择 DISTINCT ON 列
- d3.js - 使圆环图可点击
- json - 如何使用聚合在 MongoDB 中的文档根目录中输出数组对象?
- python-3.x - 在包中设计通用类定义的pythonic方式是什么?
- angular - Angular 应用程序在本地工作,但在部署时返回 404
- reactjs - 空白 React.JS 结果
- java - MongoDB 文档和集合为空
- python - 如何从pdf的不同部分提取文本并创建excel?