【问题标题】:How can I fix this error that I am getting with my pthread code?如何解决我在 pthread 代码中遇到的这个错误?
【发布时间】:2016-01-28 13:14:07
【问题描述】:

我目前是一名初学者,正在学习如何在 C 中使用 pthreads。我的代码目前正在运行,因此没有实际的错误,但它并没有达到预期的效果。该代码应提示用户提出每个问题,然后在用户输入其信息后打印所有结果,但一旦输入名称,该代码似乎会跳过并完成。请有人能帮我找到我的代码哪里出错了吗?以下是我的代码和运行时的输出:

#include <stdio.h
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <sched.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <string.h>
#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

typedef struct compound {
     char name [1024];
     int age;
     int birthMonth;
     int birthYear;
     int threadNumber;
}compound;

   void * threadName (void * param){

    compound *lparam = (compound *) param;

    int lock;

    lock = pthread_mutex_lock(&mutex);

    printf ("> Please type your name for thread %d\n", lparam->threadNumber);
    scanf ("%c", lparam->name);

    lock = pthread_mutex_unlock(&mutex);

    lock = pthread_mutex_lock(&mutex);

    printf ("> Please type your age for thread %d\n", lparam->threadNumber);
    scanf ("%d", &(lparam->age));

    lock = pthread_mutex_unlock(&mutex);

    lock = pthread_mutex_lock(&mutex);

    printf ("> Please type your birth month for thread %d\n", lparam->threadNumber);
    scanf ("%d", &(lparam->birthMonth));

    lock = pthread_mutex_unlock(&mutex);

    lock = pthread_mutex_lock(&mutex);

    printf ("> Please type your birth year for thread %d\n", lparam->threadNumber);
    scanf ("%d", &(lparam->birthYear));

    lock = pthread_mutex_unlock(&mutex);
    return NULL;
}

// main function
int main ( void) {

    pthread_t thread_ID3, thread_ID4;
    void *exitstatus;

    compound first, second;
    first.threadNumber= 1;
    second.threadNumber = 2;

    pthread_create (&thread_ID3, NULL, threadName, &first);
    pthread_create (&thread_ID4, NULL, threadName, &second);

    pthread_join (thread_ID3, &exitstatus);
    pthread_join (thread_ID4, &exitstatus);

    printf("Finished\n");

    getchar();
    return 0;
}

This is what happens when the code is executed:

[370user14@nostromo ex2]$ make
gcc -Wall  -c base_code.c
gcc -lm -lpthread base_code.o  -o baseprog
rm -f *.o *~
[370user14@nostromo ex2]$ ./baseprog 
> Please type your name for thread 1
gurinder
> Please type your age for thread 1
> Please type your birth month for thread 1
> Please type your name for thread 2
> Please type your age for thread 2
> Please type your birth month for thread 2
> Please type your birth year for thread 2
> Please type your birth year for thread 1
Finished

【问题讨论】:

  • “我的代码目前正在运行,所以没有实际的错误,但它不是它应该做的。”如果有错误,大多数游戏都会运行。错误是语义上的错误行为,它很好地允许代码编译。
  • 您可能想在尝试多线程编程之前学习顺序编程。您对scanf() 的使用令人不安。
  • 您可能想检查对scanf 的第一次调用,这似乎不符合读取字符串的正确格式...
  • “我的代码目前正在运行,所以没有实际的错误,但它不是它应该做的事情”——这就是罗马人所说的“矛盾本身”的意思。
  • 1) 发布的代码包含这一行:#include &lt;stdio.h 缺少最终的&gt; 2) 发布的代码设置变量lock,但从未使用它。

标签: c macos terminal pthreads mutex


【解决方案1】:

这是更正后的代码,修复了对 scanf() 的调用,消除了杂乱,包括了适当的错误检查,公理 每行只有一个语句,并且(最多)每个语句一个变量声明 紧随其后,其他 cmets 并入。

#include <stdio.h>
#include <stdlib.h> // exit(), EXIT_FAILURE
#include <pthread.h> // pthread_*()
//#include <semaphore.h>
//#include <sched.h>
//#include <unistd.h>
//#include <signal.h>
//#include <sys/types.h>
//#include <string.h>


pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

typedef struct compound
{
     char name [1024];
     int age;
     int birthMonth;
     int birthYear;
     int threadNumber;
} compound;


void * threadName (void * param)
{
    compound *lparam = (compound *) param;

    pthread_mutex_lock(&mutex);

    printf ("> Please type your name for thread %d\n", lparam->threadNumber);
    scanf ("%1023s", lparam->name);

    pthread_mutex_unlock(&mutex);

    pthread_mutex_lock(&mutex);

    printf ("> Please type your age for thread %d\n", lparam->threadNumber);
    scanf ("%d", &(lparam->age));

    pthread_mutex_unlock(&mutex);

    pthread_mutex_lock(&mutex);

    printf ("> Please type the number of your birth month for thread %d (January=1)\n", lparam->threadNumber);
    scanf ("%d", &(lparam->birthMonth));

    pthread_mutex_unlock(&mutex);

    pthread_mutex_lock(&mutex);

    printf ("> Please type your birth year for thread %d\n", lparam->threadNumber);
    scanf ("%d", &(lparam->birthYear));

    pthread_mutex_unlock(&mutex);
    pthread_exit( NULL );
} // end function: threadName


// main function
int main (void)
{

    pthread_t thread_ID3;
    pthread_t thread_ID4;


    compound first;
    compound second;

    first.threadNumber= 1;
    second.threadNumber = 2;

    if( 0 != pthread_create (&thread_ID3, NULL, threadName, (void*)&first) )
    { // then pthread_create failed
        perror( "pthread_create for first thread failed");
        exit( EXIT_FAILURE );
    }

    // implied else pthread_create successful

    if( 0 != pthread_create (&thread_ID4, NULL, threadName, (void*)&second) )
    { // then pthread_create failed
        perror( "pthread_create for second thread failed" );
        exit( EXIT_FAILURE );
    }

    // implied else pthread_create successful

    pthread_join (thread_ID3, NULL);
    pthread_join (thread_ID4, NULL);

    printf("Finished\n");

    int ch;
    while( (ch = getchar()) != EOF && '\n' != ch );
    getchar(); // wait for user to enter a final keystroke
    return 0;
} // end function: main

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 2018-09-14
    • 2021-02-01
    • 1970-01-01
    • 2020-08-13
    相关资源
    最近更新 更多