Встроенный Python в программировании сокетов C ++

Могу ли я не отправлять и получать пакеты UDP в одной C ++ встроенной программе на Python, в которой сценарии отправки и получения выполняются в разных потоках?
Я получаю необработанное исключение при запуске exe-файла. Когда одна из команд отправки или получения закомментирована, то есть PyRun_SimpleString (sendPy) или PyRun_SimpleString (recPy), тогда программа работает нормально.
В чем здесь ошибка?

Код приведен ниже:

DWORD WINAPI sendPack(LPVOID iValue)
{while(1){

const char* sendPy = "UDPSockSend.sendto('10707',('10.107.35.167',21567))";
PyRun_SimpleString(sendPy);

}
return 0;
}DWORD WINAPI receive(LPVOID iValue){while(1){

Py_Initialize();
recPy = "data,addr = UDPSockRcv.recvfrom(99000)";
PyRun_SimpleString(recPy);

}

return 0;

}

int threads()
{

HANDLE sendPackThread, receiveThread;
DWORD dwGenericThread;

char lszThreadParam[4];

receiveThread =
CreateThread(NULL,0,receive,&lszThreadParam,0,&dwGenericThread);
if(receiveThread == NULL){
DWORD dwError = GetLastError();
return 0;
}sendPackThread =
CreateThread(NULL,0,sendPack,&lszThreadParam,0,&dwGenericThread);
if(sendPackThread == NULL){
DWORD dwError = GetLastError();
std::cout<<"SCM:Error in Creating send sample thread"<<dwError<<"\n" ;
return 0;
}

return 1;
}int main(int argc, char* argv[])
{

using namespace std;
Py_Initialize();

const char * initPy = "import socket;
UDPSockSend = socket.socket(socket.AF_INET,socket.SOCK_DGRAM);
UDPSockRcv = socket.socket(socket.AF_INET,socket.SOCK_DGRAM);
listen_addr = ('',2000);UDPSockRcv.bind(listen_addr)";
PyRun_SimpleString(initPy);int thd = threads();

system("pause");
return 0;

}

заранее спасибо

0

Решение

Я думаю, что проблема в том, что Python не является потокобезопасным. Вы не можете просто получить доступ к интерпретатору из двух потоков и ожидать, что он работает. Увидеть http://docs.python.org/2/c-api/init.html#non-python-created-threads Больше подробностей. По сути, вы должны приобрести и освободить GIL (глобальная блокировка интерпретатора).

Эта вещь является своего рода мьютексом, который гарантирует, что только один поток обращается к объектам Python одновременно. GIL также является причиной плохой производительности многопоточного Python.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]