使用线程

时间:2015-06-04 18:35:54

标签: c pthreads palindrome

编写一个接收单词作为参数的程序。对于命令行中的每个单词,它创建一个线程,检查该单词是否为回文结构。如果单词是回文,它会递增一个全局变量(在线程中)。

这就是我所做的: 它不起作用,因为类型在功能回文中不兼容。我能做什么?我可以通过其他方式传递命令行参数(不是通过使用myStruct)吗?

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

int var_global = 0;
pthread_mutex_t mtx; 
typedef struct{
    char* word;
}myStruct;

int palindrome(myStruct aux){
    int k = strlen(aux);
    int i;
    for (i=0; i<k/2; i++) {
        if(aux[i] != aux[k-i])
            return 0;
    }
    return 1;
}

void* f(void* w){
    myStruct aux;
    aux=*(myStruct*)w;

    if (palindrom(aux)==1){
        pthread_mutex_lock(&mtx);
        var_global++;
        pthread_mutex_unlock(&mtx);
    }
}
int main(int argc, char *argv[]){
     int i;
     pthread_t threads[argc];
     pthread_mutex_init(&mtx, NULL); 

     myStruct s[argc];
     for (i=1;i<argc;i++){ 
        s[i].word = argv[i];
        pthread_create(&threads[i], NULL, f, &s[i]);
     }

     for (i =1; i<argc; ++i)
        pthread_join(threads[i], NULL);

     printf("the global variable has the value: %d \n", var_global);
     pthread_mutex_destroy(&mtx);

     return 0;
}

1 个答案:

答案 0 :(得分:1)

您是否从两个不同的程序中窃取代码并尝试将它们粉碎在一起或者是什么?

gcc说:

  

/usr/include/string.h:395:15:注意:预期'const char *'但参数类型为'myStruct'

尽管线程代码很糟糕,编写代码的人可能知道该怎么做。

但我今天心情很好,所以:

int var_global = 0;

已经为零了。可怕的非描述性名称。

pthread_mutex_t mtx; 
typedef struct{
    char* word;
}myStruct;

可怕的间距。

int palindrome(myStruct aux){

为什么呢?如何传递字符串?

int k = strlen(aux);

显然,strlen需要一个const char *,而不是&#39; myStruct&#39;。

int i;
for (i=0; i<k/2; i++) {

可怕的间距。优选地是:&#34; for(i = 0; i

    if(aux[i] != aux[k-i])

不正确的。让我们考虑字符串&#34; crap&#34;。 strlen是4,因此引用索引为4的元素给出了终止&#39; \ 0&#39;。因此,您始终将第一个元素与终止&#39; \ 0&#39;。

进行比较
        return 0;
    }
    return 1;
}

void* f(void* w){
    myStruct aux;
    aux=*(myStruct*)w;

为什么过度复制?怎么回事myStruct * aux = w;

    if (palindrome(aux)==1){

为什么要明确比较?只传递字符串。

        pthread_mutex_lock(&mtx);
        var_global++;
        pthread_mutex_unlock(&mtx);
    }
}

缺少退货声明。

int main(int argc, char *argv[]){
     int i;
     pthread_t threads[argc];

不正确的。让我们考虑一个带有1个参数的调用。这给了argc 2,表格尺寸过大。

     pthread_mutex_init(&mtx, NULL); 

     myStruct s[argc];

同样在这里。

     for (i=1;i<argc;i++){ 

可怕的间距,也与先前可怕的间距不一致。

argc应该递减,这个循环应该从0开始。

        s[i].word = argv[i];
        pthread_create(&threads[i], NULL, f, &s[i]);

缺少错误检查。

     }

     for (i =1; i<argc; ++i)
        pthread_join(threads[i], NULL);

     printf("the global variable has the value: %d \n", var_global);
     pthread_mutex_destroy(&mtx);

     return 0;
}