Call to undefined function '_beginthreadex' in function main() - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здесь реализуется задача о 5-ти китайских философах, обедающих за столом
#include<windows.h>      //подключаем библиотеки
#include<stdlib.h>
#include<process.h>
#include<stdio.h>
#include<conio.h>       //библиотека содержащая функцию очистки экрана

HANDLE hstdin, hstdout, hthread1, hthread2, hthread3, hthread4, hthread5, hthread6, hthread7, fork1, fork2, fork3, fork4, fork5, fork6, fork7;      //хэндлы для работы нитей, семафоров вилок и ввода вывода
CRITICAL_SECTION csec;                            // критическая секция для работы с выводом на экран
 
void main()                                     //основная программа
{
                    //обозначаем что нити будут расположены после основной части программы
void phil1();
void phil2();
void phil3();                                  
void phil4();
void phil5();
void phil6();
void phil7();
unsigned long threadid1,threadid2,threadid3,threadid4,threadid5,threadid6,threadid7;     //идентификатор для нитей
DWORD actlen,pmode;             // параметры для установки опроса консоли
COORD pos;                      // координатная переменная
INPUT_RECORD inpbuf;            // переменная принятия событий от консоли
int j;                          // переменная определяющая координату мышки по Y
InitializeCriticalSection(&csec);  //инициализация критической секции для правильного согласования работы параллельных нитей
 
hstdout=GetStdHandle(STD_OUTPUT_HANDLE);    // инициализация хэндлов ввода, ввывода
hstdin=GetStdHandle(STD_INPUT_HANDLE);
 
fork1=CreateMutex(NULL,FALSE,NULL);       //инициализация семафоров Mutex для вилок
if (fork1==NULL)
{printf("Mutex=%d\n", fork1);
getchar();}
 
fork2=CreateMutex(NULL,FALSE,NULL);
if (fork2==NULL)
{printf("Mutex=%d\n", fork2);
getchar();}
 
fork3=CreateMutex(NULL,FALSE,NULL);
if (fork3==NULL)
{printf("Mutex=%d\n", fork3);
getchar();}
 
fork4=CreateMutex(NULL,FALSE,NULL);
if (fork4==NULL)
{printf("Mutex=%d\n", fork4);
getchar();}
 
fork5=CreateMutex(NULL,FALSE,NULL);
if (fork5==NULL)
{printf("Mutex=%d\n", fork5);
getchar();}
 
fork6=CreateMutex(NULL,FALSE,NULL);
if (fork6==NULL)
{printf("Mutex=%d\n", fork6);
getchar();}
 
fork7=CreateMutex(NULL,FALSE,NULL);
if (fork7==NULL)
{printf("Mutex=%d\n", fork7);
getchar();}
 
hthread1=(HANDLE)_beginthreadex(phil1, 4096, NULL, NULL, 0, &threadid1);        //Запуск нитей 
if(hthread1==NULL) {printf("hthread1=%d\n", hthread1); getchar();}
 
hthread2=(HANDLE)_beginthreadex(phil2, 4096, NULL, NULL, 0, &threadid2);
if(hthread2==NULL) {printf("hthread2=%d\n", hthread2); getchar();}
 
hthread3=(HANDLE)_beginthreadex(phil3, 4096, NULL, NULL, 0, &threadid3);
if(hthread3==NULL) {printf("hthread3=%d\n", hthread3); getchar();}
 
hthread4=(HANDLE)_beginthreadex(phil4, 4096, NULL, NULL, 0, &threadid4);
if(hthread4==NULL) {printf("hthread4=%d\n", hthread4); getchar();}
 
hthread5=(HANDLE)_beginthreadex(phil5, 4096, NULL, NULL, 0, &threadid5);
if(hthread5==NULL) {printf("hthread5=%d\n", hthread5); getchar();}
 
hthread6=(HANDLE)_beginthreadex(phil6, 4096, NULL, NULL, 0, &threadid6);
if(hthread6==NULL) {printf("hthread6=%d\n", hthread6); getchar();}
 
hthread7=(HANDLE)_beginthreadex(phil7, 4096, NULL, NULL, 0, &threadid7);
if(hthread7==NULL) {printf("hthread6=%d\n", hthread7); getchar();}
 
clrscr();                                                                           // очистка экрана
 
EnterCriticalSection(&csec);                                                        //вход в критическую секцию для запрета нитям использования 
SetConsoleTextAttribute(hstdout,FOREGROUND_GREEN|FOREGROUND_RED);                  // установка цвета вывода
 
pos.X=0;                                                                           //установка координат курсора вывода
pos.Y=0;                                                     
SetConsoleCursorPosition(hstdout,pos); 
printf("    00000           00000           00000           00000\n");        //рисование философов
printf("    0* *0       0* *0       0* *0       0* *0\n");
printf("     000         000         000         000 \n");

pos.X=0;                                                                           //рисование вилок
pos.Y=4;                                                     
SetConsoleCursorPosition(hstdout,pos); 
printf(" ---E       ---E        ---E        ---E        ---E\n");
 
pos.X=0;
pos.Y=7;                                                     
SetConsoleCursorPosition(hstdout,pos); 
printf("            ---E        ---E\n");

pos.X=0;
pos.Y=8;                                                     
SetConsoleCursorPosition(hstdout,pos); 
printf("        00000       00000       00000\n");
printf("        0* *0       0* *0       0* *0\n");
printf("         000         000         000 \n"); 
LeaveCriticalSection(&csec);

                                                                   //инициализация работы с консолью
  GetConsoleMode(hstdin,&pmode);
SetConsoleMode(hstdin,pmode | ENABLE_MOUSE_INPUT);
 
do                                                  //цикл основной программы до нажатия обоих клавиш мыши
    {    
    ReadConsoleInput(hstdin,&inpbuf,1,&actlen);                                         //чтение с консоли
        if (inpbuf.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED)     //определение типа события консоли
            {   
                            j=inpbuf.Event.MouseEvent.dwMousePosition.X;                //чтение координаты Y в переменную j
if ((j>=0)&(j<=14))
{                                                                                           // затирка рук философов и освобождение семафоров вилок
EnterCriticalSection(&csec);
pos.X=5;
pos.Y=3;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("            ");
ReleaseMutex(fork1);
ReleaseMutex(fork2);
    
LeaveCriticalSection(&csec);            
}

if ((j>=24)&(j<=30))
{
EnterCriticalSection(&csec);
pos.X=20;
pos.Y=3;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("            ");
ReleaseMutex(fork2);
ReleaseMutex(fork3);
    
LeaveCriticalSection(&csec);            
}

if ((j>=41)&(j<=47))
{
EnterCriticalSection(&csec);
pos.X=35;
pos.Y=3;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("            ");
ReleaseMutex(fork3);
ReleaseMutex(fork4);
    
LeaveCriticalSection(&csec);            
}

if ((j>=57)&(j<=63))
{
EnterCriticalSection(&csec);
pos.X=50;
pos.Y=3;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("            ");
ReleaseMutex(fork4);
ReleaseMutex(fork5);
    
LeaveCriticalSection(&csec);            
}

if ((j>47)&(j<57))
{
EnterCriticalSection(&csec);
pos.X=47;
pos.Y=7;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("            ");
ReleaseMutex(fork5);
ReleaseMutex(fork6);
    
LeaveCriticalSection(&csec);            
}

if ((j>30)&(j<41))
{
EnterCriticalSection(&csec);
pos.X=28;
pos.Y=7;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("            ");
ReleaseMutex(fork6);
ReleaseMutex(fork7);
    
LeaveCriticalSection(&csec);            
}

if ((j>14)&(j<24))
{
EnterCriticalSection(&csec);
pos.X=10;
pos.Y=7;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("            ");
ReleaseMutex(fork1);
ReleaseMutex(fork7);
    
LeaveCriticalSection(&csec);            
}
            }
    
    }
while (inpbuf.Event.MouseEvent.dwButtonState!=FROM_LEFT_1ST_BUTTON_PRESSED+RIGHTMOST_BUTTON_PRESSED);
DeleteCriticalSection(&csec);                     // завершение программы, закрытие хэндлов, удаление критической секции
CloseHandle(hthread1);
CloseHandle(hthread2);
CloseHandle(hthread3);
CloseHandle(hthread4);
CloseHandle(hthread5);
CloseHandle(hthread6);
CloseHandle(hthread7);
CloseHandle(hstdout);;
CloseHandle(fork1);
CloseHandle(fork2);
CloseHandle(fork3);
CloseHandle(fork4);
CloseHandle(fork5);
CloseHandle(fork6);
CloseHandle(fork7);
CloseHandle(hstdin);
}

                                                  // Нить философа1
void phil1()
{
COORD pos;
while(TRUE){
randomize();                                       // выполняется до завершения основной программы
Sleep(random(4800));                               // случайное время прогулки философа
WaitForSingleObject(fork1, INFINITE);            // ожидание освобождения вилки - семафора
WaitForSingleObject(fork2, INFINITE);
 
EnterCriticalSection(&csec);                            // отрисовка рук философа
SetConsoleTextAttribute(hstdout,FOREGROUND_BLUE);   
 
pos.X=5;
pos.Y=3;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("M          M"); 
LeaveCriticalSection(&csec);
Sleep(random(3000));                               //случайное время состояния "ем"
pos.X=5;                                           //затирка рук философа 
pos.Y=3;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("            ");
ReleaseMutex(fork1);                             // освобождение вилок - семафоров
ReleaseMutex(fork2);
}
}
 
void phil2()
{
COORD pos;
while(TRUE){
randomize();
Sleep(random(5500)); 
WaitForSingleObject(fork2, INFINITE);
WaitForSingleObject(fork3, INFINITE);
 
EnterCriticalSection(&csec);
SetConsoleTextAttribute(hstdout,FOREGROUND_GREEN);   
 
pos.X=20;
pos.Y=3;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("M          M"); 
LeaveCriticalSection(&csec);
Sleep(random(2500));
pos.X=20;
pos.Y=3;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("            ");
ReleaseMutex(fork2);
ReleaseMutex(fork3);
}
}

void phil3()
{
COORD pos;
while(TRUE){
randomize();
Sleep(random(6000)); 
WaitForSingleObject(fork3, INFINITE);
WaitForSingleObject(fork4, INFINITE);
 
EnterCriticalSection(&csec);
SetConsoleTextAttribute(hstdout,FOREGROUND_BLUE);   
 
pos.X=35;
pos.Y=3;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("M          M"); 
LeaveCriticalSection(&csec);
Sleep(random(4000));
pos.X=35;
pos.Y=3;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("            ");
ReleaseMutex(fork3);
ReleaseMutex(fork4);
}
}
 
void phil4()
{
COORD pos;
while(TRUE){
randomize();
Sleep(random(3000)); 
WaitForSingleObject(fork4, INFINITE);
WaitForSingleObject(fork5, INFINITE);
 
EnterCriticalSection(&csec);
SetConsoleTextAttribute(hstdout,FOREGROUND_RED);   
 
pos.X=50;
pos.Y=3;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("M          M"); 
LeaveCriticalSection(&csec);
Sleep(random(5000));
pos.X=50;
pos.Y=3;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("            ");
ReleaseMutex(fork4);
ReleaseMutex(fork5);
}
}
 
void phil5()
{
COORD pos;
while(TRUE){
randomize();
Sleep(random(6000)); 
WaitForSingleObject(fork5, INFINITE);
WaitForSingleObject(fork6, INFINITE);
 
EnterCriticalSection(&csec);
SetConsoleTextAttribute(hstdout,FOREGROUND_GREEN);   
 
pos.X=47;
pos.Y=7;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("M          M"); 
LeaveCriticalSection(&csec);
Sleep(random(3000));
pos.X=47;
pos.Y=7;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("            ");
ReleaseMutex(fork5);
ReleaseMutex(fork6);
}
}
 
void phil6()
{
COORD pos;
while(TRUE){
randomize();
Sleep(random(5000)); 
WaitForSingleObject(fork6, INFINITE);
WaitForSingleObject(fork7, INFINITE);
 
EnterCriticalSection(&csec);
SetConsoleTextAttribute(hstdout,FOREGROUND_RED);   
 
pos.X=28;
pos.Y=7;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("M          M"); 
LeaveCriticalSection(&csec);
Sleep(random(3000));
pos.X=28;
pos.Y=7;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("            ");
ReleaseMutex(fork6);
ReleaseMutex(fork7);
}
}
 
void phil7()
{
COORD pos;
while(TRUE){
randomize();
Sleep(random(2000)); 
WaitForSingleObject(fork1, INFINITE);
WaitForSingleObject(fork7, INFINITE);
 
EnterCriticalSection(&csec);
SetConsoleTextAttribute(hstdout,FOREGROUND_RED|FOREGROUND_BLUE);   
 
pos.X=10;
pos.Y=7;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("M          M"); 
LeaveCriticalSection(&csec);
Sleep(random(4000));
pos.X=10;
pos.Y=7;                                                     
SetConsoleCursorPosition(hstdout,pos);
printf("             ");
ReleaseMutex(fork1);
ReleaseMutex(fork7);
}
}
не запускается как консольное приложение в Borland, выдает вот эту ошибку:Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland 1philos.cpp: Error E2268 1philos.cpp 68: Call to undefined function '_beginthreadex' in function main() *** 1 errors in Compile *** помогите разобраться в чем дело, пожалуйста

Решение задачи: «Call to undefined function '_beginthreadex' in function main()»

textual
Листинг программы
unsigned int threadid1,threadid2,threadid3,threadid4,threadid5,threadid6,threadid7;     //идентификатор для нитей

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.571 из 5