私がやろうとしているのは、それぞれがcrit_area
関数を実行する 2 つのスレッドを開始することです。BANK 構造体がスレッドによって順次更新されるように、ptrBankをto に渡す必要がありmain()
ます。これを達成するために、独自のセマフォ クラスを作成しました。以下を除くすべてのコンパイル エラーを解決しました。crit_area()
balance[0]
balance[1]
sem_class-1.h
race1d.cc:49:61: error: invalid conversion from ‘void* (*)(BANK*)’ to ‘void* (*)(void*)’ [-fpermissive]
/usr/include/pthread.h:225:12: error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’ [-fpermissive]
race1d.cc:54:61: error: invalid conversion from ‘void* (*)(BANK*)’ to ‘void* (*)(void*)’ [-fpermissive]
/usr/include/pthread.h:225:12: error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’ [-fpermissive]
race1d.cc: In function ‘void* crit_area(BANK*)’:
race1d.cc:105:10: error: too few arguments to function ‘void (* signal(int, __sighandler_t))(int)’
/usr/include/signal.h:101:23: note: declared here
私はまだポインターに慣れていません (このコードの一部は最初から私に与えられたものです)、pthread を介して構造体へのポインターを関数に渡すことができるかどうかさえわかりません。pthread 関数呼び出しでさまざまな方法でポインターを渡そうとしましたが、pthread_create(&tid1, NULL, crit_area, ptrBank)
すべてpthread_create(&tid1, NULL, crit_area, *ptrBank)
無駄になりました。また、同様の問題をオンラインで検索するのに数時間費やしました。誰でも助けることができますか?はい...これは宿題の一部で、研究室のパートナーと私はこの最後の部分を除いてすべて完了しました。[私たちの新しいコードを判断しないでください]
#include <unistd.h> /* Symbolic Constants */
#include <sys/types.h> /* Primitive System Data Types */
#include <sys/wait.h> /* System error numbers */
#include <errno.h> /* Errors */
#include <stdio.h> /* Input/Output */
#include <stdlib.h> /* General Utilities */
#include <pthread.h> /* POSIX Threads */
#include <string.h> /* String handling */
//#include <semaphore.h> /* Semaphore */
//#include <fcntl.h> /* Needed for arguments to sem_open */
#include "shm437.h"
#include "sem_class-1.h"
// BANK Structure, with integer variable 'balance'
struct BANK
{
int balance[2];
// BANK function sets balance variable == 0
BANK()
{
balance[0]=balance[1]=0;
}
};
void * crit_area(BANK * a);
// Begin main program
int main(int argc, char **argv)
{
pthread_t tid1, tid2;
Shm437 *pShmBank = new Shm437(1,sizeof(BANK)); // set up pointers
BANK *ptrBank = (BANK*) pShmBank->ShmAlloc();
ptrBank->balance[0] = ptrBank->balance[1] = 100;
Semaphore(1); // initialize Semaphore class, pass sig
srandom(getpid()); // set seed
printf("Init balances 0:%d + 1:%d ==> %d!\n", // print initial
ptrBank->balance[0],
ptrBank->balance[1],
ptrBank->balance[0]+ptrBank->balance[1]
);
if(pthread_create(&tid1, NULL, crit_area, ptrBank)) // p thread 1
{
printf("\n ERROR creating thread 1");
exit(1);
}
if(pthread_create(&tid2, NULL, crit_area, ptrBank)) // p thread 2
{
printf("\n ERROR creating thread 2");
exit(1);
}
if(pthread_join(tid1, NULL)) //wait for the thread 1 to finish
{
printf("\n ERROR joining thread");
exit(1);
}
if(pthread_join(tid2, NULL)) // wait for the thread 2 to finish
{
printf("\n ERROR joining thread");
exit(1);
}
// print new values
printf("Let's check the balances 0:%d + 1:%d ==> %d ?= 200\n",
ptrBank->balance[0],ptrBank->balance[1],
ptrBank->balance[0]+ptrBank->balance[1]);
pthread_exit(NULL);
Semaphore(1);
}
/* Thread Function critical area where we will use semaphore
and create balance with timing delay */
void * crit_area(BANK * a)
{
int tmp1, tmp2, rint;
double dummy;
wait(0);
for (int i=0; i < 100; i++) // loop for 99 times
{
tmp1 = a->balance[0]; // tmp1 var is equal to balance[0] or 100 //line 49
tmp2 = a->balance[1]; // tmp2 var is equal to balance[1] or 100
rint = (rand()%20)-10; // rint var == random number (0 thru 19)-10 or -10 thru 9
// using the seed number (PID) as the starting value
if ((tmp1+rint)>=0 && (tmp2-rint)>=0) // if non-negative
{
a->balance[0] = tmp1 + rint; // if not, change balance[0] to tmp1+rint //line 55
for (int j=0; j < rint*100; j++) // run this math problem for rint*100 times
{dummy=2.345*8.765/1.234; }
usleep(1);
a->balance[1] = tmp2 - rint; // change balance[1] to tmp2-rint //line 63
}
}
signal(1);
}