本文已参与「新人创作礼」活动,一起开启掘金创作之路。
编写一个函数,反转给定的输入字符串中每一行的字符顺序,输入字符串中的每一行都以一个标准的换行符('\n')结束。输入字符串中的每一行可以是任意长度的,包括非常短的行(很少的字符)和非常长的行(很多字符)。你的函数必须有如下子函数:
int parallel_reverse_chars(char *data,int nthreads);
其中data指向输入字符串,nthreads是在并行化工作中创建和使用的工作线程数,如下所述。返回时,字符串中每一行的字符顺序必须颠倒,函数还必须返回输入字符串中行数的整数结果。
每个工作线程应该重复以下两个步骤:“声明”输入字符串中下一个未声明的行,(2)颠倒该行字符的顺序。在你的解决方案中,它必须对所有人都可行
线程同时在步骤(2)上工作,每个线程在输入字符串的不同行上工作。如果一个工作线程发现在输入字符串中没有更多未声明的行,那么该工作线程应该终止。一旦所有的工作线程都终止了,原始线程就应该返回给调用者,就像上面定义的那样。例如,如果输入字符串是
"abc\ndefgh\ni\njklmn\n"
然后你的函数返回的输入字符串现在应该等于
"cba\nhgfed\ni\nnmlkj\n"
和函数结果4。
此外,您的解决方案可能不使用malloc()(或相关函数)来动态分配内存,内存大小与输入字符串中的字符数或行数成比例,或与输入字符串中任何特定行中的字符数成比例。CSDN @ with small inscription inscription
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
//https://www.cnblogs.com/chenjx85/p/10574752.html
int rows=0,idx=1,len;
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
void* my_func(void* args) {
char* s=(char*)args;
while(1){
int now;
pthread_mutex_lock(&mut);//在访问公共资源之前加锁
if(idx>rows){
pthread_mutex_unlock(&mut);
return NULL;
}
now=idx;
idx++;
pthread_mutex_unlock(&mut);//公共资源访问结束后解锁
int j=0,l,r;
//printf("%d",now);
for(int i=0;i<len;i++){
if(j==(now-1)){
l=i;
break;
}
if(s[i]=='\n')j++;
}
for(int i=l;i<len;i++){
if(s[i]=='\n')j++;
if(j==now){
r=i;
break;
}
}
char tmp;
for(int i=0;i<(r-l)/2;i++){
tmp=s[l+i];
s[l+i]=s[r-1-i];
s[r-1-i]=tmp;
}
printf("%d %d\r\n",l,r);
}
return NULL;
}
int parallel_reverse_chars(char* data, int nthreads) {
len=strlen(data);
for(int i=0;i<len;i++){
if(data[i]=='\n')rows++;
}
pthread_t th[1000];
for(int i=0;i<nthreads;i++){
pthread_create(&th[i], NULL, (void*)my_func, data);
}
for(int i=0;i<nthreads;i++){
pthread_join(th[i], NULL);
}
return rows;
}
int main() {
char string[128] = "abc\ndefgh\ni\njklmn\n";
int ret = parallel_reverse_chars(string,4);
printf("%d\r\n",rows);
printf("%s",string);
return 0;
}