多线程实现字符串翻转_Q5函数“parallel_reverse_chars”

141 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

请添加图片描述
编写一个函数,反转给定的输入字符串中每一行的字符顺序,输入字符串中的每一行都以一个标准的换行符('\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;
}