2014-04-27 21 views
1

我在做什么错误的代码? 这就像一个票务系统,你有不同的卖家出售34张票。使用线程和信号量的代码

#include <stdio.h> 
#include <stdbool.h> 
#define NUM_TICKETS 35 
#define NUM_SELLERS 4 
/** 
* The ticket counter and its associated lock will be accessed 
* all threads, so made global for easy access. 
*/ 

static int numTickets = NUM_TICKETS; 
static ticketsLock; 


/** 
* Our main is creates the initial semaphore lock in an unlocked state 
* (one thread can immediately acquire it) and sets up all of 
* the ticket seller threads, and lets them run to completion. They 
* should all finish when all tickets have been sold. 
*/ 
void main(int argc, char **argv) 
{ 
    int i; 
    char name[32]; 
    bool verbose = (argc == 2 && (strcmp(argv[1], "-v") == 0)); 
    InitThreadPackage(verbose); 
    ticketsLock = SemaphoreNew("Tickets Lock", 1); 
    for (i = 0; i < NUM_SELLERS; i++) { 
     sprintf(name, "Seller #%d", i); // give each thread a distinct name 
     ThreadNew(name, SellTickets, 0); 
    } 
    RunAllThreads(); // Let all threads loose 
    SemaphoreFree(ticketsLock); // to be tidy, clean up 
    printf("All done!\n"); 
} 

static void SellTickets(void) 
{ 
    bool done = false; 
    int numSoldByThisThread = 0; // local vars are unique to each thread 
    while (!done) { 
     /** 
     * imagine some code here which does something independent of 
     * the other threads such as working with a customer to determine 
     * which tickets they want. Simulate with a small random delay 
     * to get random variations in output patterns. 
     */ 
     RandomDelay(500000, 2000000); 
     SemaphoreWait(ticketsLock); // ENTER CRITICAL SECTION 
     if (numTickets == 0) { // here is safe to access numTickets 
      done = true; // a "break" here instead of done variable 
         // would be an error- why? 
     } else { 
      numTickets--; 
      numSoldByThisThread++; 
      printf("%s sold one (%d left)\n", ThreadName(), numTickets); 
     } 
     SemaphoreSignal(ticketsLock); // LEAVE CRITICAL SECTION 
    } 
    printf("%s noticed all tickets sold! (I sold %d myself) \n", 
    ThreadName(), numSoldByThisThread); 
} 

输出应该是这样的:

Seller #1 sold one (34 left) 
Seller #0 sold one (33 left) 
Seller #1 sold one (32 left) 
Seller #1 sold one (31 left) 
Seller #1 sold one (30 left) 
Seller #1 sold one (29 left) 
Seller #1 sold one (28 left) 
Seller #2 sold one (27 left) 
Seller #3 sold one (26 left) 
Seller #2 sold one (25 left) 
Seller #3 sold one (24 left) 
Seller #2 sold one (23 left) 
Seller #0 sold one (22 left) 
Seller #1 sold one (21 left) 
Seller #2 sold one (20 left) 
Seller #0 sold one (19 left) 
Seller #1 sold one (18 left) 
Seller #1 sold one (17 left) 
Seller #3 sold one (16 left) 
Seller #2 sold one (15 left) 
Seller #0 sold one (14 left) 
Seller #0 sold one (13 left) 
Seller #1 sold one (12 left) 
Seller #3 sold one (11 left) 
Seller #2 sold one (10 left) 
Seller #0 sold one (9 left) 
Seller #0 sold one (8 left) 
Seller #1 sold one (7 left) 
Seller #3 sold one (6 left) 
Seller #2 sold one (5 left) 
Seller #0 sold one (4 left) 
Seller #1 sold one (3 left) 
Seller #1 sold one (2 left) 
Seller #1 sold one (1 left) 
Seller #1 sold one (0 left) 
Seller #3 noticed all tickets sold! (I sold 5 myself) 
Seller #2 noticed all tickets sold! (I sold 7 myself) 
Seller #1 noticed all tickets sold! (I sold 15 myself) 
Seller #0 noticed all tickets sold! (I sold 8 myself) 
All done! 

但是,编译器告诉我下面的: SellTickets()未申报(第一次在这个函数中使用)

谁能帮助我解决这个问题?

谢谢

这是当我切换顺序或之前主声明函数,我得到的错误:

/tmp/ccXC17qT.o: In function `main': 
new.c:(.text+0x6b): undefined reference to `InitThreadPackage' 
new.c:(.text+0x7f): undefined reference to `SemaphoreNew' 
new.c:(.text+0xc7): undefined reference to `ThreadNew' 
new.c:(.text+0xd8): undefined reference to `RunAllThreads' 
new.c:(.text+0xe5): undefined reference to `SemaphoreFree' 
/tmp/ccXC17qT.o: In function `SellTickets': 
new.c:(.text+0x132): undefined reference to `RandomDelay' 
new.c:(.text+0x13f): undefined reference to `SemaphoreWait' 
new.c:(.text+0x16a): undefined reference to `ThreadName' 
new.c:(.text+0x18c): undefined reference to `SemaphoreSignal' 
new.c:(.text+0x19c): undefined reference to `ThreadName' 
collect2: ld returned 1 exit status 
+0

什么是'ThreadName'?什么是“RandomDelay”? –

回答

1

你缺少的SellTickets()的函数原型。

把函数原型static void SellTickets(void);放在函数main()的上面。

static void SellTickets(void); 

void main(int argc, char **argv) 
{ 
    ... 
} 

static void SellTickets(void) 
{ 
    ... 
} 

或者,你可能只是改变main()SellTickets()位置。

static void SellTickets(void) 
{ 
    ... 
} 

void main(int argc, char **argv) 
{ 
    ... 
} 

对于与线程等功能,你必须为他们#include正确的头文件。之后,它可能会通过编译器,但您还必须链接到正确的库,或者编译并链接那些线程相关函数的源代码。你能识别你正在使用的线程库吗?

谷歌搜索显示了这些线程相关的功能都是从这里:http://see.stanford.edu/materials/icsppcs107/22-Thread-Package-Docs.pdf

假设它是您正在使用, 还假设两个头文件和库文件是在正确的路径线程库,编译器和链接器可以在您的程序中找到, #include "thread_107.h,并链接到libthread_107.a。

+0

当我更改订单或在开始时声明函数时,它不起作用。我得到上面的错误 – user3577233

+0

就像SellTickets()的情况一样,您也需要为其他函数提供函数原型。他们可能有适当的头文件。我编辑了我的答案。 – Keugyeol