【问题标题】:Incompatible types when passing a struct传递结构时不兼容的类型
【发布时间】:2014-10-12 01:08:28
【问题描述】:

我有一个程序,它为 C 中的监视器(一次只运行一个线程的抽象对象)测试创建多个线程。我在它似乎工作但在其他地方明显失败的地方遇到错误,我认为是由于每个线程拥有自己的显示器。

我需要以某种方式将结构或指向它的指针从一个程序传递给另一个程序,以便我可以确保它们都指向同一个。在这个实现中,我遇到了分段错误,我认为在没有指导的情况下进行更多工作只会使程序更加复杂。

除了在两个程序中都定义它之外,必须有更好的方法来定义这个 Struct 吗?

相关监控代码:

#define N 5
#include<stdio.h>
#include <pthread.h>
#include<semaphore.h>

struct cond {
   int blocked;
   sem_t sema,empty, full;
   int count;
    char buf[N];
};

void waitNotEmpty(struct cond mon);
void waitNotFull(struct cond mon);
//void signalNotEmpty(void);
//void signalNotFull(void);
struct cond spawnMonitor(void);
void moninsert(char alpha, struct cond mon);
char monremove(struct cond mon);

struct cond spawnMonitor(void){
    struct cond mon;
    sem_init(&mon.sema, 0, 1);
    mon.blocked = 0;
    sem_init(&mon.empty, 0, 0);
    sem_init(&mon.full, 0, 1);
    mon.count = 0;
    int value; 
    sem_getvalue(&mon.sema, &value); 
     printf("INITIAL VALUE: %d\n", value);
     return mon;
}   

以及运行它的 MonitorDemo 程序:

#define N 10000000
#include<stdio.h>
#include <pthread.h>
#include<semaphore.h>


struct cond {
    int blocked;
    sem_t sema,empty, full;
    int count;
    char buf[N];
};

struct cond mon;

void main (void)
{

    void producer ();
    void consumer ();

    int i = 0;
    pthread_t thread[10];
    mon = spawnMonitor();
    for(i = 0; i < 10; i++){
        pthread_create(&thread[i], NULL, (void *) producer, NULL);
        i++;
        pthread_create(&thread[i], NULL, (void *) consumer, NULL);
    }
}

【问题讨论】:

  • 有一个更好的方法来定义结构,而不是在两个程序中都有它;您可以将它放在两个程序都包含的头文件中。但这并不能解决 Incompatible types when passing a struct 错误。如果您遇到该错误,请发布一个演示错误的 SSCCE,并准确指出错误发生在哪一行。 sscce.org
  • 请注意,您有不兼容的类型,因为 N 在一个文件中为 5,而在另一个文件中为 10,000,000! void main() 在您使用 pthread.h 的系统上无效(除非您在 Windows 上使用 POSIX 线程,这似乎不太可能)。您应该在头文件中定义struct(它的所有方面,包括N 的值)。
  • 无关:您的main() 正处于一个受伤的世界。一旦这些线程全部启动并且 for 循环完成,就没有什么可以阻止 main() 终止。你永远不会加入你产生的任何一个线程。我建议在重新阅读有关您的结构兼容性的书籍时,说您的 pthread 文本也是如此。
  • 我更正了 N =5 或 100000 的问题并添加了一个头文件。线程不需要加入(我假设这意味着与收集的任何数据一起),因为它只是为了测试它们与数组的交互,我将 while 循环切换到 for (i:1 to 5) 以简化。我应该延迟主线程结束吗?也许是某种 while (threads != done) 循环?

标签: c struct monitor


【解决方案1】:

我应该延迟主线程结束吗?某种时候 (threads != done) 循环?

POSIX Threads Programming 谈到终止线程

  • 如果您没有显式调用pthread_exit(),那么如果main() 在它产生的线程之前完成,就会出现一个明确的问题。它创建的所有线程都将终止,因为 main() 已完成并且不再存在以支持线程。
  • 通过让 main() 显式调用 pthread_exit() 作为它所做的最后一件事,main() 将阻塞并保持活动状态以支持它创建的线程,直到它们完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-10
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 2013-05-08
    • 2011-02-23
    • 1970-01-01
    相关资源
    最近更新 更多